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,排序就完成了。

第一次在博客园写文章,心情激动。。。
posted @ 2008-06-27 13:27  HollenZhao  阅读(8325)  评论(3编辑  收藏  举报