0

我有一个看起来像这样的 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>
4

1 回答 1

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指令的文档顺序。

于 2012-08-06T16:05:36.873 回答