任何人都可以建议如何使用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>
预期输出应为:
答案 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>