假设以下XML输入 -
<parent>
<name>Bob</name>
<name>Alice</name>
<another-attribute>something</another-attribute>
<city>Kansas City</city>
<city>Atlanta</city>
</parent>
如何按字母顺序对同类属性进行排序?换句话说,这是预期的输出 -
<parent>
<name>Alice</name>
<name>Bob</name>
<another-attribute>something</another-attribute>
<city>Atlanta</city>
<city>Kansas City</city>
</parent>
我能够通过stackoverflow中的各种示例完成一些更复杂的排序,但我正在努力解决这个问题。
免责声明:我是一名XSLT菜鸟,所以请轻易放弃滥用。
答案 0 :(得分:0)
一种方法是将for-each
es与xsl:sort
一起使用
在下面的代码中,for-each
选择所有name
个节点,并按其text()
内容对其进行排序。分别对city
个元素相同。中间的xsl:copy-of
复制了不是name
或city
元素本身的所有其他元素。
开头的xsl:copy
复制当前所选元素parent
,以下xsl:copy-of
复制其(可能)属性。
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>
<xsl:template match="parent">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:for-each select="name">
<xsl:sort select="text()" />
<xsl:copy-of select="." />
</xsl:for-each>
<xsl:copy-of select="*[not(self::name | self::city)]" />
<xsl:for-each select="city">
<xsl:sort select="text()" />
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>