过去一天我一直在努力弄清楚如何计算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列A. 和div列B,两者都是 垂直列。我的老板想要所有的 书签要包装,但我不能 在中间开始包裹 类别块。我的意图是 跟踪3个变量来做到这一点: 到目前为止(A)列A中的总书签, 到目前为止B列中的总书签(B), 以及中的书签数量 下一个要放置的类别块(C)。 如果B + C大于A,我会 将块放入columnA,我会 否则将它放入columnB。是否 这现在更有意义吗?太多了。
答案 0 :(得分:3)
此样式表(您的算法):
<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>
答案 1 :(得分:1)
对count()
属性中的谓词使用select
XPath函数。
答案 2 :(得分:0)
您可以使用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)'>