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

Javascript 为每个循环计算XSL中的元素数?,javascript,xslt,Javascript,Xslt,在过去的一天中,我一直在尝试找出如何计算XSL中每个循环的元素数。我尝试过使用javascript,但似乎无法让它正常工作。我不确定这是否只是一个不能正确显示输出的问题,或者是否可以使用XSLT来实现这一点。任何帮助都将不胜感激。这是一个我没有准备好的讨厌的错误 <script type="text/javascript"> var colATotal=0; function loopCounterA(){ colATotal++; } function printA(){

在过去的一天中,我一直在尝试找出如何计算XSL中每个循环的元素数。我尝试过使用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>

var colATotal=0;
函数a(){
阴道液++;
}
函数printA(){
文件编写(COLATOAL);
}
a();
printA();
来自评论:

我想显示所有的代码可能是 浪费时间。我有一个div columnA 和一个div columnB,两者都是 立柱。我的老板想要所有的东西 书签需要包装,但我不能 在中间开始包装 类别块。我的意图是 要做到这一点,请跟踪3个变量: 到目前为止,A列中的书签总数(A), 到目前为止,B列中的书签总数(B), 和中的书签数量 要放置的下一个类别块(C)。 如果B+C大于A,我将 将块放入columnA中,我将 否则,请将其放入B列。做 这现在更有意义了吗?太多了


select
属性的谓词上使用
count()
XPath函数。

select
属性的谓词上使用
count()
XPath函数。

您可以使用
count()
函数并使用它简化JavaScript。不需要迭代XML来生成JavaScript,JavaScript被调用n次以生成计数

<script type="text/javascript">
var colATotal=<xsl:value-of select='count(bookmarks/category/bookmark)'>;

function printA(){
   document.write(colATotal);
}

printA();

</script>

阴道向量=;
函数printA(){
文件编写(COLATOAL);
}
printA();
如果将其放入JavaScript的目的只是将其转换为具有计数的HTML,而您只是使用JavaScript来创建所需的HTML(但不知道如何在XSLT中执行),请尝试询问如何在XSLT中执行此操作

这并不像你想象的那么难,只是做得和你习惯的不一样。XSLT是一种声明式编程风格,您可以作为过程式程序员来使用它

您可以只选择元素的计数,并将其直接放入HTML输出中,例如:

<b>The total count of bookmarks is:</b> <xsl:value-of select='count(bookmarks/category/bookmark)'>
书签总数为:

您可以使用
count()
函数简化JavaScript。不需要迭代XML来生成JavaScript,JavaScript被调用n次以生成计数

<script type="text/javascript">
var colATotal=<xsl:value-of select='count(bookmarks/category/bookmark)'>;

function printA(){
   document.write(colATotal);
}

printA();

</script>

阴道向量=;
函数printA(){
文件编写(COLATOAL);
}
printA();
如果将其放入JavaScript的目的只是将其转换为具有计数的HTML,而您只是使用JavaScript来创建所需的HTML(但不知道如何在XSLT中执行),请尝试询问如何在XSLT中执行此操作

这并不像你想象的那么难,只是做得和你习惯的不一样。XSLT是一种声明式编程风格,您可以作为过程式程序员来使用它

您可以只选择元素的计数,并将其直接放入HTML输出中,例如:

<b>The total count of bookmarks is:</b> <xsl:value-of select='count(bookmarks/category/bookmark)'>
书签总数为:
此样式表(您的算法):


通过此输入:

<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>

此样式表(您的算法):


通过此输入:

<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>


您是否只需要将类别元素的数量乘以类别元素的数量?有更好的方法来实现这一点(我想到了
count
函数)。不,我将类别块放在两列中,为了尽可能均匀地放置它们,我希望跟踪已经放置在两列中的书签数量,并将该数量与下一个要放置的块中的书签数量进行比较,如果你知道我的意思……我会尝试将[position()mod 2==0]wither作为谓词或测试条件,将列表拆分为两个bucket,使偶数“行”进入一列,“奇数”行进入另一列。如果您需要一种不同类型的拆分,我仍然会关注于count()和position()的简单数学如何告诉您如何进行拆分。在您展示的代码中,不清楚您打算做什么-使用XSLT生成JS或在XSLT中实际运行JS。后者就是不符合设计。显示一段原始XML树和一段较长的代码片段