首页 > 解决方案 > 使用 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/ 来完成。

标签: xmlxsltsaxon

解决方案


如果是

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

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

您需要在and上使用as属性xsl:variablexsl: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函数,因此即使您需要对输入节点进行排序,您也不需要像这样的 XSLT 元素,xsl:for-each/xsl:sort或者xsl:perform-sort/xsl:sort只需在XPath 表达式中使用该sort函数。select


推荐阅读