为什么xsl:sort选择器不起作用?

问题描述

| 给定以下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属性。