计算每个循环的XSL中的元素数量?

时间:2010-12-02 16:48:33

标签: javascript xslt

过去一天我一直在努力弄清楚如何计算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。是否   这现在更有意义吗?太多了。

3 个答案:

答案 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)'>