Почему не работает этот xsl: sort селектор? - PullRequest
1 голос
/ 26 мая 2011

С учетом следующего 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>

Я хочу вывести тот же XML, отсортированный по атрибуту ID. Следующая таблица стилей делает то, что я хочу. Закомментированный xsl:sort (и несколько вариантов, которые я пробовал) не работает - я просто получаю несортированную копию оригинального документа. (И никаких сообщений об ошибках.)

Как конкретно выбрать атрибут ID для элемента Thing (чтобы не использовать атрибуты 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>

1 Ответ

5 голосов
/ 26 мая 2011

Вы хотите

    <xsl:sort select="Thing/@ID" data-type="number"/>

В точке, где это происходит, контекст уже находится на каждом первом уровне Thing, поэтому ключ сортировки является атрибутом @ID Thing второго уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...