2016-12-05 118 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

相關問題