xsl多排序层次结构

时间:2012-08-06 13:51:11

标签: xml xslt

我有一个XML结构,看起来像这样 -

<Root>
  <name rank = "1">ABC
     <name rank ="1">BCD</name>
  </name>
  <name rank ="0">XYZ
     <name rank ="1">BCD</name>
     <name rank ="3">YYZ</name>
     <name rank ="0">FEG</name>
     <name rank ="0">DEG</name>         
  </name>
</Root>

我希望通过复制它来保存层次结构并按顺序对其进行排序来转换此XML (1)按排名(升序) (2)如果等级相等,则按名称(升序)对其进行排序

转换后,结构应如下所示。

<Root>      
      <name rank ="0">XYZ
         <name rank ="0">DEG</name>
         <name rank ="0">FEG</name>
         <name rank ="1">BCD</name>
         <name rank ="3">YYZ</name>         
      </name>
      <name rank = "1">ABC
         <name rank ="1">BCD</name>
      </name>
 </Root>

我有以下XSL,它不保留层次结构或给我正确的排序。有人可以帮帮我吗?这是我第一次使用XSL,并希望得到正确方向的任何帮助或指示。

<xsl:template match="/*">

    <xsl:copy>
    <xsl:for-each select="//name">
        <xsl:sort select="@rank" data-type="number" order="ascending"/>
        <xsl:sort select="name" order="ascending" />
        <xsl:copy-of select="."/>
    </xsl:for-each> 
    </xsl:copy>
  </xsl:template>

1 个答案:

答案 0 :(得分:0)

此转化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <Root>
    <xsl:apply-templates select="name">
     <xsl:sort select="@rank" data-type="number"/>
     <xsl:sort/>
    </xsl:apply-templates>
  </Root>
 </xsl:template>

 <xsl:template match="name">
  <name rank="{@rank}">
    <xsl:copy-of select="text()"/>
    <xsl:apply-templates select="name">
     <xsl:sort select="@rank" data-type="number"/>
     <xsl:sort/>
    </xsl:apply-templates>
  </name>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<Root>
  <name rank = "1">ABC
     <name rank ="1">BCD</name>
  </name>
  <name rank ="0">XYZ
     <name rank ="1">BCD</name>
     <name rank ="3">YYZ</name>
     <name rank ="0">FEG</name>
     <name rank ="0">DEG</name>
  </name>
</Root>

生成想要的正确结果

<Root>
    <name rank="0">XYZ
        <name rank="0">DEG</name>
        <name rank="0">FEG</name>
        <name rank="1">BCD</name>
        <name rank="3">YYZ</name></name>
    <name rank="1">ABC
        <name rank="1">BCD</name></name>
</Root>

<强>解释

使用两条xsl:sort说明。排序操作的优先级对应于相应xsl:sort指令的文档顺序。