如何用XSL进行间接排序

有如下的XML:

 1<root>
 2<classes>
 3<class order="1">class2</class>
 4<class order="2">class1</class>   
 5...   
 6</classes>
 7<data>
 8<row>
 9<content>first line</content>
10<class>class1</class>
11</row>
12<row>
13<content>second line</content>
14<class>class2</class>
15</row>
16</data>
17</root>

如果使用一般的排序法,使用以下XSL文件

1<xsl:for-each select="/root/data/row">
2<xsl:sort select="class"></xsl:sort>
3<xsl:value-of select="content"></xsl:value-of><br/>
4</xsl:for-each>

返回的结果应该是:
first line
second line

但是,如果我们可以用一种更好的方法进行排序。通过class找到与之对应的/root/classes/class下的某个class,然后按照它的order属性进行排序。这样排序的结果应该是:
second line
first line

如何实现呢?请看以下XSL文件:

 1<xsl:stylesheet version="1.0" xmlns:msxml="urn:schemas-microsoft-com:xslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 2<xsl:template match="/">
 3<xsl:variable name="data_tf">
 4<root>
 5<xsl:for-each select="/root/classes/class">
 6<!--可修改order属性,以决定不同class排序,ascending-升序;descending-降序-->
 7<xsl:sort data-type="number" order="ascending" select="@order"></xsl:sort>
 8<xsl:variable name="class" select="."></xsl:variable>
 9<data>
10<xsl:attribute name="order"><xsl:value-of select="@order"></xsl:value-of></xsl:attribute>
11<xsl:apply-templates select="/root/data/row[class=$class]">
12<!--可修改order属性,以决定相同class排序,ascending-升序;descending-降序-->
13<xsl:sort order="ascending" select="position()"></xsl:sort>
14</xsl:apply-templates>
15</data>
16</xsl:for-each>
17</root>
18</xsl:variable>
19<xsl:variable name="data_class" select="msxml:node-set($data_tf)"></xsl:variable>
20<xsl:for-each select="$data_class/root/data/row">
21<xsl:value-of select="content"></xsl:value-of>
22</xsl:for-each>
23</xsl:template>
24<xsl:template match="row">
25<xsl:copy-of select="."></xsl:copy-of>
26</xsl:template>
27</xsl:stylesheet>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus