xsl:value-of不允许包含任何下一个 xsl 元素,例如xsl :sort。sort 命令仅适用于xsl:for-each或xsl:apply-templates。
<xsl:for-each select="short_name/value" >
<xsl:sort select="."/>
<xsl:value-of select="." />
</xsl:for-each>
或者,由于最好使用模板而不是 for-each,您可以这样做
<xsl:apply-templates select="short_name/value">
<xsl:sort select="."/>
</xsl:apply-templates>
除非您想要输出文本值以外的任何内容,否则您不需要为value元素匹配模板,因为在这种情况下,XSLT 处理器的默认行为将输出文本。
需要注意的一件事是,在您的示例中,您只会输出一个选项元素。您确定不想要多个,每个 id 或 short_name 一个。当然,这取决于您的 XML 输入示例,但假设您有这样的 XML
<people>
<person><id><value>3</value></id><short_name><value>C</value></short_name></person>
<person><id><value>1</value></id><short_name><value>A</value></short_name></person>
<person><id><value>2</value></id><short_name><value>B</value></short_name></person>
</people>
然后,如果您使用以下 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="people">
<xsl:apply-templates select="person">
<xsl:sort select="short_name/value"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="person">
<option value="{id/value}">
<xsl:value-of select="short_name/value"/>
</option>
</xsl:template>
</xsl:stylesheet>
然后输出如下
<option value="1">A</option>
<option value="2">B</option>
<option value="3">C</option>