问题描述
使用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>
变量的值是一个文档片段节点,其中包含您选择的元素的副本。
您需要在as
和xsl: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:sort
或xsl:perform-sort/xsl:sort
之类的XSLT元素,而只需使用sort
XPath表达式中的select
函数。