使用xsl,按子节点的值对节点进行排序

3

是否可能使用XSL对以下XML进行排序(按照mm/dd/yyyy格式的日期,按组中的SubGroup排序):

<Data version="2.0">
   <Group>
        <SubGroup>          
            <Date>11/14/2011</Date>
        </SubGroup>
        <SubGroup>          
            <Date>10/25/2011</Date>
        </SubGroup>
   </Group>
   <Group>
        <SubGroup>
            <Date>01/14/2008</Date>
        </SubGroup>
        <SubGroup>          
            <Date>11/01/2005</Date>
        </SubGroup>
   </Group>
</Data>

将其转换为以下内容:

<Data version="2.0">
   <Group>
        <SubGroup>
            <Date>10/25/2011</Date>
        </SubGroup>
        <SubGroup>          
            <Date>11/14/2011</Date>
        </SubGroup>
   </Group>
   <Group>
        <SubGroup>
            <Date>11/01/2005</Date>
        </SubGroup>
        <SubGroup>          
            <Date>01/14/2008</Date>
        </SubGroup>
   </Group>
</Data>

我认为有两个任务:1)按内部节点中的值对子组进行排序;2)按特定格式的日期进行排序。如果您知道如何解决(1)问题并按整数值进行排序,请发布答案。

1个回答

3
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="Group">
    <xsl:copy>
      <xsl:apply-templates select="SubGroup">
        <xsl:sort select="concat(
                  substring(Date, 7, 4),
                  substring(Date, 1, 2),
                  substring(Date, 4, 2)
                  )"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

它的工作很好,只是在XML规范化方面有一些小问题:在XSL转换之后,</SubGroup><SubGroup>在同一行上。是否有任何能力保留原始XML中的换行符? - purum
@purum,尝试在开头添加<xsl:strip-space elements="*"/> - Kirill Polishchuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接