如何在XSLT中对节点及其后续同级进行排序?

时间:2019-05-23 15:44:40

标签: xml xslt

我正在尝试使用XSLT按子元素值对XML文件进行排序。排序元素具有以下同级元素,应该始终位于其后。

到目前为止我已经完成的XSLT:

primitive interface methods

XML文件如下:

<xsl:template match="parent">
    <xsl:copy>
        <xsl:copy-of select="@*" />

        <xsl:copy-of select="*[not(self::city | self::cityNumber)]" />
        <xsl:for-each select="city">
            <xsl:sort select="text()" />
            <xsl:copy-of select="." />
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

我希望输出:

<parent>
    <name>Bob</name>
    <name>Alice</name>
    <another-attribute>something</another-attribute>
    <city>B.111Kansas City</city>
    <cityNumber>1</cityNumber>
    <city>A.123Atlanta</city>
    <cityNumber>2</cityNumber>
</parent>

谢谢!

2 个答案:

答案 0 :(得分:1)

怎么样:

<xsl:template match="parent">
    <xsl:copy>
        <xsl:copy-of select="*[not(self::city or self::cityNumber)]" />
        <xsl:for-each select="city">
            <xsl:sort/>
            <xsl:copy-of select=". | following-sibling::cityNumber[1]" />
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

答案 1 :(得分:1)

如果您有多个cityNumber,并且希望与city元素一起排序,则可以使用<xsl:for-each-group select="city | cityNumber" group-starting-with="city">并对组进行排序:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:output indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="parent">
      <xsl:copy>
          <xsl:apply-templates select="* except (city, cityNumber)"/>
          <xsl:for-each-group select="city | cityNumber" group-starting-with="city">
              <xsl:sort/>
              <xsl:apply-templates select="current-group()"/>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/gWvjQfL