Сортировать XML по именам атрибутов, используя XSLT

Кто-нибудь может предложить, как отсортировать XML по именам атрибутов с помощью XSLT?

Например: мой XML такой, как показано ниже

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <!-- test 1 -->
    <test g="r">
        <a g="c" d="e">one</a>
        <!-- a k z d b -->
        <a k="z" d="b">two</a>
        <a s="h" d="5">three</a>
        <!-- a a b d 4 -->
        <a a="b" d="4">four</a>
        <a b="q" d="3">five</a>
        <a s="a" d="8">3three</a>
        <a x="i" d="2">six</a>
        <!-- six 2 a f h i 2 -->
        <a f="h" i="2">six</a>
        <a l="t" d="1">seven</a>
    </test>
    <!-- test 2 -->
    <test t="b">
        <!-- six 2 a z i d 2 -->
        <a z="i" d="2">six</a>
        <a r="z" d="b">two</a>
        <a a="c" d="e">one</a>
        <a u="h" d="5">three</a>
        <!-- four -->
        <a c="b" d="4">four</a>
        <a h="q" d="3">five</a>
        <a p="t" d="1">seven</a>
    </test>
</root>

ожидаемый результат должен быть:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <!-- test 1 -->
    <test g="r">
        <!-- a a b d 4 -->
        <a a="b" d="4">four</a>
        <a b="q" d="3">five</a>
        <a g="c" d="e">one</a>
        <!-- six 2 a f h i 2 -->
        <a f="h" i="2">six</a>      
        <!-- a k z d b -->
        <a k="z" d="b">two</a>
        <a l="t" d="1">seven</a>
        <a s="a" d="8">3three</a>
        <a s="h" d="5">three</a>
        <a x="i" d="2">six</a>
    </test>
    <!-- test 2 -->
    <test t="b">
        <a a="c" d="e">one</a>
        <!-- four -->
        <a c="b" d="4">four</a>
        <a h="q" d="3">five</a>
        <a p="t" d="1">seven</a>
        <a r="z" d="b">two</a>
        <a u="h" d="5">three</a>
        <!-- six 2 a z i d 2 -->
        <a z="i" d="2">six</a>
    </test>
</root>

4 ответа

Решение

Я сам нашел решение. Ниже приведена строка кода, которая будет использоваться для сортировки по именам атрибутов.

<xsl:sort select="local-name(@*)"/>

Ребята, спасибо за все ваши усилия.

Я подозреваю, что вы, возможно, захотите отсортировать по имени первого атрибута. Это невозможно сделать, потому что порядок атрибутов не имеет значения в XML, и вы не можете предсказать, какой атрибут @*[1] выберет.

Ответ был здесь в сообщении 1429991

(как ни странно, пример кода в теле вопроса работает).

  <xsl:template match="test">
    <xsl:apply-templates>
      <xsl:sort select="@d"/>
    </xsl:apply-templates>
  </xsl:template>

даст вам элементы под test отсортировано по атрибуту d,

Вы можете сделать несколько уровней сортировки, добавив еще один xsl:sort,

Подробнее о сортировке здесь: http://www.w3.org/TR/xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:output indent="yes" />
  <xsl:strip-space elements="*"/> 
  <xsl:template match="*">
    <xsl:copy> 
      <xsl:apply-templates select="@*">        
        <xsl:sort select="name()"/> 
    </xsl:apply-templates>
      <xsl:apply-templates>
        <xsl:sort select="name()"/>
        <xsl:sort select= "name(@*)"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
 <xsl:template match="@*">
    <xsl:copy />     
  </xsl:template>
</xsl:stylesheet>
Другие вопросы по тегам