使用xsl:for-each循环而不是xsl:variable中的select =“ expr”进行查询时遇到的问题

问题描述

使用2种不同的技术选择元素时,变量$ var的计数不同:-

<xsl:variable name="var" select="$doc//ns:abc | $doc//ns:xyz"/>

<xsl:message select="count($var)"/>

提供适当的计数

但是

<xsl:variable name="var" >
    <xsl:for-each select="$doc//ns:abc | $doc//ns:xyz">
        <xsl:copy-of select="."/>
    </xsl:for-each>
</xsl:variable>

<xsl:message select="count($var)"/>

给出1

如何也使用for-each循环获得适当的计数。因为我想按排序顺序存储元素,所以只能通过在xsl:for-each /中使用xsl:sort /来完成。

解决方法

对于

<xsl:variable name="var" >
    <xsl:for-each select="$doc//ns:abc | $doc//ns:xyz">
        <xsl:copy-of select="."/>
    </xsl:for-each>
</xsl:variable>

变量的值是一个文档片段节点,其中包含您选择的元素的副本。

您需要在asxsl:variable上使用xsl:sequence属性

<xsl:variable name="var" as="node()*">
    <xsl:for-each select="$doc//ns:abc | $doc//ns:xyz">
        <xsl:sequence select="."/>
    </xsl:for-each>
</xsl:variable>

或者简单地

<xsl:variable name="var" as="node()*">
    <xsl:sequence select="$doc//ns:abc | $doc//ns:xyz"/>
</xsl:variable>

从输入文档中选择节点作为节点序列。

请注意,XPath 3也具有sort函数,因此即使您需要对输入节点进行排序,也不需要xsl:for-each/xsl:sortxsl:perform-sort/xsl:sort之类的XSLT元素,而只需使用sort XPath表达式中的select函数。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...