2010-05-25 109 views
-1

我有一個XML文件,我想按屬性排序。該文件的結構如下圖所示:通過XSL排序XML文件

<wb xmlns:cf="http://www.macromedia.com/2004/cfform"> 

    <a:form name="chart"> 

     <a:input FIELDNUMBER="09" INDEX="2" LEFT="200" /> 
     <a:input FIELDNUMBER="08" INDEX="3" LEFT="200" /> 

     <a:fieldset FIELD="a" FIELDNAME="FieldSet1">        
      <a:input FIELDNUMBER="02" INDEX="4" LEFT="200" /> 
      <a:select1 FIELDNUMBER="01" /> 
     </a:fieldset> 

     <a:fieldset FIELD="b" FIELDNAME="FieldSet1">        
      <a:input FIELDNUMBER="04" INDEX="7" LEFT="200" /> 
      <a:select1 FIELDNUMBER="03" /> 
      <a:fieldset FIELD="c" FIELDNAME="FieldSet1">        
       <a:input FIELDNUMBER="06" INDEX="8" LEFT="200" /> 
       <a:input FIELDNUMBER="05" INDEX="6" LEFT="200" /> 
      </a:fieldset> 
     </a:fieldset> 

    </a:form> 

</wb> 

我想上面的XML排序貫穿所有通過@fieldnumber,但同時我想保持XML的結構相同。我設法對其他XML文件進行排序,但他們沒有這樣的嵌套層次。這是可能的,只有XSL,如果是這樣可以做到這一點?

輸出應該如下:

<wb xmlns:cf="http://www.macromedia.com/2004/cfform"> 

    <a:form name="chart"> 

     <a:input FIELDNUMBER="08" INDEX="3" LEFT="200" /> 
     <a:input FIELDNUMBER="09" INDEX="2" LEFT="200" /> 

     <a:fieldset FIELD="a" FIELDNAME="FieldSet1">        
      <a:select1 FIELDNUMBER="01" /> 
      <a:input FIELDNUMBER="02" INDEX="4" LEFT="200" /> 
     </a:fieldset> 

     <a:fieldset FIELD="b" FIELDNAME="FieldSet1">        
      <a:select1 FIELDNUMBER="03" /> 
      <a:input FIELDNUMBER="04" INDEX="7" LEFT="200" /> 
      <a:fieldset FIELD="c" FIELDNAME="FieldSet1">        
       <a:input FIELDNUMBER="05" INDEX="6" LEFT="200" /> 
       <a:input FIELDNUMBER="06" INDEX="8" LEFT="200" /> 
      </a:fieldset> 
     </a:fieldset> 

    </a:form> 

</wb> 

作爲另一示例,如果FIELDNUMBER 04被改變到的值大於7,如10(讓我們假定10在本例中),那麼的輸出字段集與現場值b變爲:

 <a:fieldset FIELD="b" FIELDNAME="FieldSet1">        
      <a:select1 FIELDNUMBER="03" /> 
      <a:fieldset FIELD="c" FIELDNAME="FieldSet1">        
       <a:input FIELDNUMBER="05" INDEX="6" LEFT="200" /> 
       <a:input FIELDNUMBER="06" INDEX="8" LEFT="200" /> 
      </a:fieldset> 
      <a:input FIELDNUMBER="10" INDEX="7" LEFT="200" /> 
     </a:fieldset> 
+0

目前尚不清楚你所說的「保持XML結構相同」在這方面的意思。顯示排序樣本輸入的輸出結果。 – 2010-05-25 18:59:03

+0

完成。 Jim,基本上我的意思是,如果XML包含大約20行,那麼排序的輸出將具有相同數量的行。這意味着排序功能將根據字段編號簡單地調換行,但同時保持相同的嵌套和等量的層次。使排序有點困難的是,我可以通過fieldnumber來排序a:fieldset中的嵌套元素。 – user164701 2010-05-25 19:20:07

+0

這還不夠信息。如果您將字段編號04更改爲FIELDNUMBER =「10」,那麼它會保留在它所在的位置還是排在包含05和06的字段集之後? – 2010-05-25 19:21:44

回答

2

儘管不一致由吉姆·加里森指出,我試圖拿出東西,你的描述相符:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:template match="*"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:for-each select="*"> 
     <xsl:sort select="@FIELDNUMBER|.//@FIELDNUMBER"/> 
     <xsl:apply-templates select="." /> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

該排序首先處理元素的FIELDNUMBER屬性,或者如果該元素本身沒有一個元素的子元素,則該元素的子元素會找到第一個FIELDNUMBER屬性。下面是輸出(的xmlns:一個被添加到源文件,因此它得到了擡到輸出):

<?xml version="1.0" encoding="utf-8"?> 
<wb xmlns:cf="http://www.macromedia.com/2004/cfform" xmlns:a="urn:dummy"> 
    <a:form name="chart"> 
    <a:fieldset FIELD="a" FIELDNAME="FieldSet1"> 
     <a:select1 FIELDNUMBER="01" /> 
     <a:input FIELDNUMBER="02" INDEX="4" LEFT="200" /> 
    </a:fieldset> 
    <a:fieldset FIELD="b" FIELDNAME="FieldSet1"> 
     <a:select1 FIELDNUMBER="03" /> 
     <a:input FIELDNUMBER="04" INDEX="7" LEFT="200" /> 
     <a:fieldset FIELD="c" FIELDNAME="FieldSet1"> 
     <a:input FIELDNUMBER="05" INDEX="6" LEFT="200" /> 
     <a:input FIELDNUMBER="06" INDEX="8" LEFT="200" /> 
     </a:fieldset> 
    </a:fieldset> 
    <a:input FIELDNUMBER="08" INDEX="3" LEFT="200" /> 
    <a:input FIELDNUMBER="09" INDEX="2" LEFT="200" /> 
    </a:form> 
</wb> 
+0

弗朗西斯之前分揀不一致,那太棒了!不僅你設法瞭解我的查詢,而且還設法給我一個完全符合我預期的輸出! – user164701 2010-05-26 05:56:40