XSLT应用-排序索引和编号
XSLT应用--排序、索引编号
排序处理
语法:<xsl:sort select="XPathExpression" lang=language-code order={"ascending" | "descending"} case-order={"upper-first" | "lower-first"} data-type={"text" | "number" | other}></xsl:sort>
说明: select:可选,指定排序关键字,默认为上下文节点;
lang:可选,指定用于排序的语言;
order:可选,指定升还是降序;
case-order:可选,指定是大写优先还是小定优先;
data-type:可选,指定按哪种数据类型排序,默认为text.
单关键字排序:<xsl:for-each select="person">
<xsl:sort select="name"/>
<tr align="center">
<xsl:apply-templates select="*"/>
</tr>
</xsl:for-each>
注意:中文字按汉语拼音在字母表中的顺序排序
多关键字排序:<xsl:for-each select="person">
<xsl:sort select="age" data-type="number"/>
<xsl:sort select="name" />
<xsl:sort select="address/province" />
<tr align="center">
<xsl:apply-templates select="*"/>
</tr>
</xsl:for-each>
要求首先按年龄,年龄相同的按姓名,如果前面两项相同再按省排序。
实例求极值,找每种商品的最大/小价格:
<xsl:template match="products">
<table border="1">
<tr>
<td>product</td>
<td>cheapest</td>
</tr>
<xsl:apply-templates select="product"/>
</table>
</xsl:template>
<xsl:template match="product">
<tr align="center">
<td>
<xsl:value-of select="name"/>
</td>
<xsl:for-each select="price[. > 0]">
<xsl:sort select="."/>
<xsl:if test="position()=1">
<td>
<xsl:value-of select="."/>
</td>
</xsl:if>
</xsl:for-each>
</tr>
</xsl:template>
建立索引:<xsl:key>使用索引:key()
语法:<xsl:key name="name" match="pattern" use="expression"/>
说明:
name:必选,指定索引名;
match:必选,指定为哪些节点建立索引;
use:必选,用来为选中的节点指定索引关键字,这里的关键字是一个XPath表达式,如果表达式与节点相关,要以match属性指定的节点为上下文节点<xsl:key>是顶层元素,这个元素只是建立索引,真正使用索引的是key()函数
一对一影射
<xsl:output method="html" encoding="GB2312" indent="yes"/>
<xsl:key name="noKey" match="person" use="@no"/>
<xsl:template match="people">
<xsl:variable name="searchNo" select="'006'"/>
<html>
<body>
<table border="1">
<tr align="center">
<td>工号</td>
<td>姓名</td>
</tr>
<tr align="center">
<td>
<xsl:value-of select="$searchNo"/>
</td>
<td>
<xsl:value-of select="key('noKey',$searchNo)/name"/>
</td>
</tr>
</table>
</body>
</html>
</xsl:template>
注意:对变量赋值时是这样的"'006'"这时的值是字符类型,这里要说明,use的XPath表达式如果是以XML文档中的元素或属性做为索引关键字那么索引值的数据类型就是字符。
一对多:当一个索引值对应多个节点时就是一对多。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="GB2312" indent="yes"/>
<xsl:key name="bookList" match="book" use="author"/>
<xsl:template match="books">
<xsl:variable name="searchAuthor" select="'冯梦龙'"/>
<xsl:element name="bookList">
<xsl:attribute name="author">
<xsl:value-of select="$searchAuthor"/>
</xsl:attribute>
<xsl:for-each select="key('bookList',$searchAuthor)">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
多对多:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="courseKey" match="course" use="student"/>
<xsl:template match="courses">
<xsl:variable name="key1" select="'Kin'"/>
<xsl:variable name="key2" select="'Leo'"/>
<xsl:copy>
<xsl:attribute name="student">
<xsl:value-of select="$key1"/>
</xsl:attribute>
<xsl:for-each select="key('courseKey',$key1)">
<xsl:copy>
<xsl:value-of select="@name"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
<xsl:copy>
<xsl:attribute name="student">
<xsl:value-of select="$key2"/>
</xsl:attribute>
<xsl:for-each select="key('courseKey',$key2)">
<xsl:copy>
<xsl:value-of select="@name"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet
注意:当XML文档很大时建立索引会用掉很多资源,执行效率大打折扣
生成编号:<xsl:number>
语法:<xsl:number count="expression" level="multiple|single|any" from="expression" value="expression" format="formatingString" lang="languagecode" grouping-separator="character" grouping-size="number" />
说明:
count:可选,值为一个XPath表达式,指定哪些节点将参与实际的计数。
level:可选,指定使用哪种方式来生成编号;
from:可选,指定从哪个节点开始计数;
value:可选,指定输出编号的值;
format:可选,指定所输出的编号格式默认为1就是按数字方式;
lang:可选,指定语言字符编号方案;
letter-value:可选,区分同一种语言的两种不同的编号方案,默认为"alphabetic"还有一个值是"traditional";
grouping-size:可选,指定们组的大小,默认为:3;
grouping-separator:可选,指定位组分隔符;