有如下的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>