2011-03-17 51 views
1

任何人都可以请建议如何使用XSLT按属性名称排序XML?使用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 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> 
+0

我可以给你一个答案,但它可能不足以满足你的任务...你想对未命名为'd'的第一个(字母顺序)属性进行排序吗? – 2011-03-19 02:24:57

回答

0

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

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

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

+0

请注意,这是错误的,因为[博士给出的理由Michael Kay](http://stackoverflow.com/questions/5338628/sort-xml-by-attribute-names-using-xslt/5338948#5338948)。因为隐式转换,这将等于'local-name(@ * [1])'。 – 2011-03-20 22:21:47

+0

@Alejandro:local-name(@*)local-name(@*[1])都代表该节点的第一个属性。这是看什么。在迈克尔解决方案的情况下,他说:“你无法预测@ * [1]会选择哪个属性......”但是当我使用local-name(@*)local-name(@*[1])时,它总是选择节点的第一个属性进行排序。所以我提到它是可能的。 2011-03-21 09:12:44

+0

在这种情况下,它将仅基于第一个属性进行排序。这应该扩展为通过传递属性

local-name(@*[position()])
的位置,然后它将基于所有可用属性进行排序。如果我说错了什么,请纠正我。感谢@Alejandro发布和更新我。 2011-03-21 09:13:22

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

将让你的属性d排序test下的元素。

您可以通过添加另一个xsl:sort来执行多个排序级别。

更多关于这里的分选:http://www.w3.org/TR/xslt#sorting

+0

哦,我没有看到您的预期输出。所以你想按属性名称排序。我不确定这是可能的,让我们看看... – Ptival 2011-03-17 12:12:59

+0

对不起ptival ..我期望在一个通用的XSLT排序格式的答案..如果可以,请张贴relavent通用XSLT。 – 2011-03-17 12:14:28

+0

那么,您如何期望XSLT能够弄清楚它应该对哪些属性进行排序呢? – Ptival 2011-03-17 12:19:55

2

我怀疑你可能会想它来排序的第一个属性的名称。这是无法完成的,因为属性顺序在XML中没有意义,并且您无法预测@ * [1]将选择哪个属性。

0

已经在这里找到答案后1429991

的(奇怪的是,代码示例中的问题作品的机构)。