繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM