包含排序节点的变量上的 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=", "/>
.
我有一个包含一系列排序节点的变量。当我使用 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=", "/>
.