假设以下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菜鸟,所以请轻松滥用虐待。
一种方法是将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>