2016-12-05 117 views
0

我已经阅读了许多基于子节点对父节点进行排序的XSLT实现。但我没有找到适合我的案例的工作解决方案。我想根据在多个级别上的子节点的(元素)值(称为“SortField”)对ElementRef节点进行排序。我有以下XML结构:XSLT - 根据多个级别上的子节点对父节点进行排序

<Root> 
    <OtherElement1></OtherElement1> 

    <Group> 
     <ID></ID> 
     <Name></Name> 

     <ElementRef> 
      <ID></ID> 

      <Element> 
       <ID></ID> 
       <Name></Name> 
       <SortField>B</SortField> 


       <ElementRef> 
        <ID></ID> 

        <Element> 
         <ID></ID> 
         <Name></Name> 
         <SortField>H</SortField> 


         <ElementRef> 
         [...] 
         </ElementRef> 

        </Element> 

       </ElementRef> 

       <ElementRef> 
        <ID></ID> 

        <Element> 
         <ID></ID> 
         <Name></Name> 
         <SortField>F</SortField> 
        </Element> 

       </ElementRef> 

       <ElementRef> 
        <ID></ID> 

        <Element> 
         <ID></ID> 
         <Name></Name> 
         <SortField>G</SortField> 
        </Element> 

       </ElementRef>   

      </Element> 

     </ElementRef> 

     <ElementRef> 
      <ID></ID> 

      <Element> 
       <ID></ID> 
       <Name></Name> 
       <SortField>C</SortField> 
      </Element> 

     </ElementRef> 

     <ElementRef> 
      <ID></ID> 

      <Element> 
       <ID></ID> 
       <Name></Name> 
       <SortField>A</SortField> 
      </Element> 

     </ElementRef> 



    </Group> 

    <OtherElement2></OtherElement2> 

</Root> 

而且结果应该是这样的:

<Root> 
    <OtherElement1></OtherElement1> 

    <Group> 
     <ID></ID> 
     <Name></Name> 


     <ElementRef> 
      <ID></ID> 

      <Element> 
       <ID></ID> 
       <Name></Name> 
       <SortField>A</SortField> 
      </Element> 

     </ElementRef> 

     <ElementRef> 
      <ID></ID> 

      <Element> 
       <ID></ID> 
       <Name></Name> 
       <SortField>B</SortField> 


       <ElementRef> 
        <ID></ID> 

        <Element> 
         <ID></ID> 
         <Name></Name> 
         <SortField>F</SortField> 
        </Element> 

       </ElementRef> 

       <ElementRef> 
        <ID></ID> 

        <Element> 
         <ID></ID> 
         <Name></Name> 
         <SortField>G</SortField> 
        </Element> 

       </ElementRef> 

       <ElementRef> 
        <ID></ID> 

        <Element> 
         <ID></ID> 
         <Name></Name> 
         <SortField>H</SortField> 


         <ElementRef> 
         [...] 
         </ElementRef> 

        </Element> 

       </ElementRef>  

      </Element> 

     </ElementRef> 

     <ElementRef> 
      <ID></ID> 

      <Element> 
       <ID></ID> 
       <Name></Name> 
       <SortField>C</SortField> 
      </Element> 

     </ElementRef> 


    </Group> 

    <OtherElement2></OtherElement2> 

</Root> 

你能为我提供了一个工作XSLT?

请注意:所有其他元素和属性保持不变非常重要!

回答

2

使用模板与xsl:sort

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="*[ElementRef]"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates select="*"> 
       <xsl:sort select="Element/SortField" data-type="text"/> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

这将输入

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <OtherElement1></OtherElement1> 

    <Group> 
     <ID></ID> 
     <Name></Name> 

     <ElementRef> 
      <ID></ID> 

      <Element> 
       <ID></ID> 
       <Name></Name> 
       <SortField>B</SortField> 


       <ElementRef> 
        <ID></ID> 

        <Element> 
         <ID></ID> 
         <Name></Name> 
         <SortField>H</SortField> 


         <ElementRef> 
          [...] 
         </ElementRef> 

        </Element> 

       </ElementRef> 

       <ElementRef> 
        <ID></ID> 

        <Element> 
         <ID></ID> 
         <Name></Name> 
         <SortField>F</SortField> 
        </Element> 

       </ElementRef> 

       <ElementRef> 
        <ID></ID> 

        <Element> 
         <ID></ID> 
         <Name></Name> 
         <SortField>G</SortField> 
        </Element> 

       </ElementRef>   

      </Element> 

     </ElementRef> 

     <ElementRef> 
      <ID></ID> 

      <Element> 
       <ID></ID> 
       <Name></Name> 
       <SortField>C</SortField> 
      </Element> 

     </ElementRef> 

     <ElementRef> 
      <ID></ID> 

      <Element> 
       <ID></ID> 
       <Name></Name> 
       <SortField>A</SortField> 
      </Element> 

     </ElementRef> 



    </Group> 

    <OtherElement2></OtherElement2> 

</Root> 

到输出

<?xml version="1.0" encoding="utf-8"?> 
<Root> 
    <OtherElement1/> 
    <Group> 
     <ID/> 
     <Name/> 
     <ElementRef> 
     <ID/> 
     <Element> 
      <ID/> 
      <Name/> 
      <SortField>A</SortField> 
     </Element> 
     </ElementRef> 
     <ElementRef> 
     <ID/> 
     <Element> 
      <ID/> 
      <Name/> 
      <SortField>B</SortField> 
      <ElementRef> 
       <ID/> 
       <Element> 
        <ID/> 
        <Name/> 
        <SortField>F</SortField> 
       </Element> 
      </ElementRef> 
      <ElementRef> 
       <ID/> 
       <Element> 
        <ID/> 
        <Name/> 
        <SortField>G</SortField> 
       </Element> 
      </ElementRef> 
      <ElementRef> 
       <ID/> 
       <Element> 
        <ID/> 
        <Name/> 
        <SortField>H</SortField> 
        <ElementRef> 
          [...] 
         </ElementRef> 
       </Element> 
      </ElementRef> 
     </Element> 
     </ElementRef> 
     <ElementRef> 
     <ID/> 
     <Element> 
      <ID/> 
      <Name/> 
      <SortField>C</SortField> 
     </Element> 
     </ElementRef> 
    </Group> 
    <OtherElement2/> 
</Root> 
+0

该解决方案对我不起作用。什么都没有排序。我从来没有见过这样的行:''。这可能是问题吗? – user3452015

+0

@ user3452015,我已经添加了我为您发布的输入获取的输出,该输出已排序。 –

+0

是的,你说得对,谢谢! – user3452015

相关问题