包含排序节点的变量上的 XSLT 2.0 字符串连接产生无序输出

XSLT 2.0 string-join on a variable containing sorted nodes produces un-ordered output

我有一个包含一系列排序节点的变量。当我使用 string-join 打印出值列表时,它们的输出顺序是它们在文档中的顺序,而不是排序顺序。这应该有效,还是我用 position() != last()?

手动构建列表?

模板

<?xml version='1.0'?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="SortedElements" as="element(Element)+">
    <xsl:perform-sort select="/Root/Element">
        <xsl:sort select="ElementNumber" data-type="number"/>
    </xsl:perform-sort>
</xsl:variable>

<xsl:template match="/">
    <xsl:text>Iterating through variable: </xsl:text>
    <xsl:for-each select="$SortedElements">
        <xsl:value-of select="ElementNumber"/>
    </xsl:for-each>
    <xsl:text> string-join: </xsl:text>
    <xsl:value-of select="string-join($SortedElements/ElementNumber, ', ')"/>
</xsl:template>

</xsl:stylesheet>

示例输入

<?xml version="1.0"?>
<Root>
    <Element>
        <ElementNumber>3</ElementNumber>
    </Element>
    <Element>
        <ElementNumber>1</ElementNumber>
    </Element>
    <Element>
        <ElementNumber>2</ElementNumber>
    </Element>
</Root>

输出

Iterating through variable: 123 string-join: 3, 1, 2

您在 string-join 中的 /ElementNumber 步骤按文档顺序排序,因此请改用 string-join (for $e in $SortedElements return $e/ElementNumber,',')。请注意,xsl:value-of 采用 separator 属性,因此您也可以使用 <xsl:value-of select="for $e in $SortedElements return $e/ElementNumber" separator=", "/> 代替 string-join,或者,如果切换到 version="3.0" 样式表,<xsl:value-of select="$sortedElements!ElementNumber" separator=", "/>.