XML節點排序的一種方法

XML節點排序的一種方法

前幾天遇到了將XML按節點屬性排序後輸出的需求,開始想用C#寫一個WinFrom應用程序實現,後來沒怎麼弄明白,後來看網上說XSL有排序的功能,就試了試,結果真的滿足需求了,方法還很簡單。

思路是用XSL將現有的XML文檔轉換爲成排序後的格式,然後將結果另存爲新的XML。

排序前的XML:

<?xml version="1.0" encoding="utf-8"?>
<xxmx>
  
<options id="2">
    
<option lable="請選擇" value=""/>
    
<option lable="或有負債" value="8"/>
    
<option lable="長期負債" value="7"/>
    
<option lable="流動負債" value="6"/>
    
<option lable="無形動產" value="5"/>
    
<option lable="無形不動產" value="4"/>
    
<option lable="不動產" value="3"/>
    
<option lable="有形動產" value="2"/>
    
<option lable="財務資產" value="1"/>
  
</options>
  
<options id="10">
    
<option lable="請選擇" value=""/>
    
<option lable="文件" value="9"/>
    
<option lable="自定義選擇" value="8"/>
    
<option lable="從庫中選擇" value="7"/>
    
<option lable="密碼域" value="6"/>
    
<option lable="文本區域" value="5"/>
    
<option lable="單選域" value="4"/>
    
<option lable="單選域(手工)" value="41"/>
    
<option lable="複選域" value="3"/>
    
<option lable="選擇域" value="2"/>
    
<option lable="文本字段" value="1"/>
    
<option lable="隱藏域" value="99"/>
    
<option lable="從庫中複選域" value="32"/>
    
<option lable="自定複選域" value="31"/>
    
<option lable="選擇域(可選)" value="21"/>
    
<option lable="選擇域(手工)" value="22"/>
  
</options>
</xxmx>


下面是XSL的代碼:
test.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
  
<html>
    
<title>
      排序後文件
    
</title>
    
<body>
      
<![CDATA[<?xml version="1.0" encoding="utf-8"?>]]>
      
<br/>
      
<![CDATA[<xxmx>]]>
      
<br/>
      
<xsl:for-each select="/xxmx/options">
        
<![CDATA[<options id="]]><xsl:value-of select="@id"/><![CDATA[">]]><br/>
        
<xsl:for-each select="option">
          
<xsl:sort data-type="number" order="ascending" select="@value"/>
          
<![CDATA[<option lable ="]]><xsl:value-of select="@lable"/><![CDATA[" value ="]]><xsl:value-of select="@value" /><![CDATA["/>]]>
          
<br/>
        
</xsl:for-each>
        
<![CDATA[</options>]]>
        
<br/>
      
</xsl:for-each>
      
<![CDATA[</xxmx>]]>
    
</body>
  
</html>
</xsl:template>
</xsl:stylesheet>

將XML和XSL放在一個文件夾裏,然後在XML的第二行加上一句:
<?xml-stylesheet type="text/xsl" href="test.xsl"?>

這樣XML就會按照XSL裏的約束顯示了,打開XML文件(我用的是IE,6、7皆可)。

下面就是排序後的XML:
<?xml version="1.0" encoding="utf-8"?>
<xxmx>
<options id="2">
<option lable ="請選擇" value =""/>
<option lable ="財務資產" value ="1"/>
<option lable ="有形動產" value ="2"/>
<option lable ="不動產" value ="3"/>
<option lable ="無形不動產" value ="4"/>
<option lable ="無形動產" value ="5"/>
<option lable ="流動負債" value ="6"/>
<option lable ="長期負債" value ="7"/>
<option lable ="或有負債" value ="8"/>
</options>
<options id="10">
<option lable ="請選擇" value =""/>
<option lable ="文本字段" value ="1"/>
<option lable ="選擇域" value ="2"/>
<option lable ="複選域" value ="3"/>
<option lable ="單選域" value ="4"/>
<option lable ="文本區域" value ="5"/>
<option lable ="密碼域" value ="6"/>
<option lable ="從庫中選擇" value ="7"/>
<option lable ="自定義選擇" value ="8"/>
<option lable ="文件" value ="9"/>
<option lable ="選擇域(可選)" value ="21"/>
<option lable ="選擇域(手工)" value ="22"/>
<option lable ="自定複選域" value ="31"/>
<option lable ="從庫中複選域" value ="32"/>
<option lable ="單選域(手工)" value ="41"/>
<option lable ="隱藏域" value ="99"/>
</options>
</xxmx>

另存爲一個新的XML,排序就完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章