2010-05-25 83 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