问题描述
|
给定以下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>
解决方法
你要
<xsl:sort select=\"Thing/@ID\" data-type=\"number\"/>
在发生这种情况的时刻,上下文已经在每个第一级Thing
处,因此排序键是第二级Thing的@ID属性。