在XSLT中对同级元素进行排序



假设以下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复制了所有其他不是namecity元素本身的元素。

开头的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>

相关内容

  • 没有找到相关文章

最新更新