使用XSLT按属性名称对XML进行排序

时间:2011-03-17 11:52:54

标签: xslt

任何人都可以建议如何使用XSLT按属性名称对XML进行排序吗?

例如:我的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 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>

预期输出应为:

5 个答案:

答案 0 :(得分:2)

我怀疑你可能希望它对第一个属性的名称进行排序。这是不可能的,因为属性的顺序在XML中没有意义,你无法预测@ * [1]将选择哪个属性。

答案 1 :(得分:0)

  <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#sorting

答案 2 :(得分:0)

我自己找到了解决方案。下面是用于按属性名称排序的代码行。

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

伙计们,感谢您的所有努力。

答案 3 :(得分:0)

此帖已在帖子1429991

中得到解答

(奇怪的是,问题正文中的代码示例有效)。

答案 4 :(得分:0)

<?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>