给出以下XML:
<?xml version="1.0"?>
<Things>
<Thing>
<Thing ID="0002"/>
<Name>Bob</Name>
</Thing>
<Thing>
<Thing ID="0003"/>
<Name>Alice</Name>
</Thing>
<Thing>
<Thing ID="0001"/>
<Name>Carol</Name>
</Thing>
</Things>
我想输出按ID属性排序的相同XML。以下样式表做我想要的。已注释掉的xsl:sort
(以及我尝试的几种变体)不起作用 - 我只是获得原始文档的未分类副本。 (并且没有错误消息。)
如何在Thing元素上专门选择ID属性(以避免在较大文档中可能存在的其他元素上使用ID属性)?
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="Things">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="*/@ID" data-type="number"/>
<!-- I don't understand why this doesn't work:
<xsl:sort select="Thing/Thing[@ID]" data-type="number"/>
-->
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:5)
你想要
<xsl:sort select="Thing/@ID" data-type="number"/>
在发生这种情况时,上下文已经出现在每个第一级Thing
,因此排序键是第二级Thing的@ID属性。