XSLT для сортировки узлов по имени? - PullRequest
14 голосов
/ 03 ноября 2010

Я не уверен, как работает директива xsl:sort. Мне нужно отсортировать элементы по имени тега (для сравнения), и я не могу придумать, как заставить это работать. Сначала я изменил преобразование идентификаторов и просто изменил его, добавив оператор сортировки, но я не совсем уверен, как это сделать.

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()">
              <!-- xsl:sort ? -->
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

1 Ответ

24 голосов
/ 03 ноября 2010

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="@*">
    <xsl:sort select="name()"/>
   </xsl:apply-templates>

   <xsl:apply-templates select="node()">
    <xsl:sort select="name()"/>
   </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML :

<t b="x" c="y" a="t">
  <c/>
  <b/>
  <a/>
</t>

производит желаемый отсортированный вывод :

<t a="t" b="x" c="y">
    <a></a>
    <b></b>
    <c></c>
</t>

Примечание :

  1. Сортируются не только элементы, но и атрибуты (последний зависит от реализации, но работает нормально с MSXML).

  2. Использование отсортированного XML для различий ненадежно , поскольку преобразование документа XML в отсортированное представление не является отображением 1: 1.

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