Сортировать 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] выберет.
2012-07-03 16:21
<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>