[英]count the number of elements in an XSL for-each loop?
我一直在尝试弄清楚如何计算XSL for-each循环中的元素数量。 我试过用javascript做它但似乎无法让它工作。 我不确定这是否只是没有正确显示输出或者你甚至可以用XSLT做这件事。 任何帮助,将不胜感激。 这是一个我不准备的令人讨厌的错误。
<script type="text/javascript">
var colATotal=0;
function loopCounterA(){
colATotal++;
}
function printA(){
document.write(colATotal);
}
</script>
<xsl:for-each select='bookmarks/category'>
<xsl:for-each select='./bookmark'>
<script type="text/javascript">
loopCounterA();
printA();
</script>
</xsl:for-each>
</xsl:for-each>
来自评论:
我认为显示所有代码可能是浪费时间。 我有一个div columnA和一个div columnB,它们都是垂直列。 我的老板想要包装所有的书签,但我不能在类别块的中间开始包装。 我的目的是跟踪3个变量来执行此操作:到目前为止列A中的总书签(A),到目前为止列B中的总书签(B),以及要放置的下一个类别块中的书签数量(C)。 如果B + C大于A,我会将块放入columnA,否则我将把它放入columnB。 这现在更有意义了吗? 太多了。
这个样式表(你的算法):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="bookmarks">
<html>
<xsl:apply-templates select="category[1]"/>
</html>
</xsl:template>
<xsl:template match="category">
<xsl:param name="pColumnA" select="/.."/>
<xsl:param name="pColumnB" select="/.."/>
<xsl:variable name="vTest" select="count($pColumnB/bookmark|bookmark)
> count($pColumnA/bookmark)"/>
<xsl:variable name="vColumnA" select="$pColumnA|self::*[$vTest]"/>
<xsl:variable name="vColumnB" select="$pColumnB|self::*[not($vTest)]"/>
<xsl:variable name="vNext" select="following-sibling::category[1]"/>
<xsl:apply-templates select="$vNext">
<xsl:with-param name="pColumnA" select="$vColumnA"/>
<xsl:with-param name="pColumnB" select="$vColumnB"/>
</xsl:apply-templates>
<xsl:if test="not($vNext)">
<div id="ColumnA">
<xsl:copy-of select="$vColumnA"/>
</div>
<div id="ColumnB">
<xsl:copy-of select="$vColumnB"/>
</div>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
有了这个输入:
<bookmarks>
<category id="a">
<bookmark id="1"/>
<bookmark id="2"/>
<bookmark id="3"/>
</category>
<category id="b">
<bookmark id="4"/>
<bookmark id="5"/>
</category>
<category id="c">
<bookmark id="6"/>
<bookmark id="7"/>
<bookmark id="8"/>
<bookmark id="9"/>
<bookmark id="10"/>
</category>
<category id="d">
<bookmark id="11"/>
<bookmark id="12"/>
<bookmark id="13"/>
<bookmark id="14"/>
<bookmark id="15"/>
</category>
</bookmarks>
输出:
<html>
<div id="ColumnA">
<category id="a">
<bookmark id="1"></bookmark>
<bookmark id="2"></bookmark>
<bookmark id="3"></bookmark>
</category>
<category id="c">
<bookmark id="6"></bookmark>
<bookmark id="7"></bookmark>
<bookmark id="8"></bookmark>
<bookmark id="9"></bookmark>
<bookmark id="10"></bookmark>
</category>
</div>
<div id="ColumnB">
<category id="b">
<bookmark id="4"></bookmark>
<bookmark id="5"></bookmark>
</category>
<category id="d">
<bookmark id="11"></bookmark>
<bookmark id="12"></bookmark>
<bookmark id="13"></bookmark>
<bookmark id="14"></bookmark>
<bookmark id="15"></bookmark>
</category>
</div>
</html>
在select
属性的谓词上使用count()
XPath函数。
您可以使用count()
函数并使用它来简化您的JavaScript。 无需迭代XML来生成多次调用以生成计数的JavaScript。
<script type="text/javascript">
var colATotal=<xsl:value-of select='count(bookmarks/category/bookmark)'>;
function printA(){
document.write(colATotal);
}
printA();
</script>
如果将它放入JavaScript中的目的只是将其转换为具有计数的HTML,并且您只是使用JavaScript来创建所需的HTML(并且无法弄清楚如何在XSLT中执行),请尝试询问如何在XSLT中执行此操作 。
它并不像你想象的那么难,它的完成方式与你习惯的完全不同。 XSLT是一种声明性编程风格,您将其作为程序编程人员来接近它。
您可以只选择元素的数量并将其直接放入HTML输出中,例如:
<b>The total count of bookmarks is:</b> <xsl:value-of select='count(bookmarks/category/bookmark)'>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.