XSLT简介
早期的XSL包括两部分,前一部分是转换XML文件,将XML文件架构转换成另一个架构,或非xml文件;后一部分是格式化XML文件,格式化元素内容的样式便于显示。因为这些功能服务着两个截然不同的目的,于是在1999年4月份,W3C正式将XSL标准的前半部(关于转换语法的叙述)从XSL中分出来,并为它起了一个新名子,叫XSLT。现在,XSL一般只在作为XSL格式化对象(XSL-FO)时才被提到,以区别于XSLT。XSL-FO有许多功能与层叠式样式表(CSS)及HTML标签集发生了重叠,我们这里主要讲的是XSLT。
2.XSLT语法
XSLT可以像DTD一样被作为一个外部文件调用,下面是一个简单的XSLT的例子。
例3-13
XML文件:hello.xml
01<? xml version=“1.0”encoding=“GB2312”>
02<? xml-stylesheet type=“text/xsl”href=“hello.xslt”>
03<hello>HELLO!!!</hello>
XSLT文件:hello.xslt
01<? xml version=“1.0”encoding=“GB2312”>
02<xsl:stylesheet version=“1.0”>
03<xsl:templatematch=“/”>
04<html>
05<head><title>简单的XSLT</title></head>
06<body>
07<h2><center><xsl:value-of select=“hello”/></center></h2>
08</body>
09</htm l>
10</xsl:template>
11</xsl:stylesheet>
上例中XML文件的第二行设定调用hello.xslt文件来完成转换,XSLT文件的编写严格遵守了XML的语法要求,它自身也是一个格式良好的XML文件。一个XSLT文件在声明为XML文件后,以<xsl: stylesheet>为根目录,根目录下就可以由一些<xsl: template>元素组成,每个元素后面就可以指定转换后的输出数据。表3-17中是XSLT的一些用来处理转换功能的默认元素。
表3-17
续表
1)<xsl: template>元素
XSLT<xsl: template>元素是用于创建模板的。Match的属性的作用是使模板和XML与元素相结合。Match属性也可以为整个XML定义模板。Match属性值是一个XPath表达式。在给出的第一个例子中,match属性的值为“/”,即表示整个文档都使用后面的定义。
2)<xsl: apply-templates>元素
<xsl: apply-templates>元素将模板应用于当前元素或应用于当前元素的子节点。
如果我们想在<xsl: apply-templates>元素中添加一个select[选择]属性,那么它仅处理与属性值相匹配的子元素以及这一子元素后面的元素,这样我们就可以使用select属性,指定子节点的处理从何处开始了。下面是一个例子。
例3-14
<xsl:templatematch=“book”>
<b><xsl:value-of select=“id”/></b>
<xsl:apply-templates select=“version”/>
</xsl:template>
上例中如果不用<xsl:apply-templates>元素,则xslt处理器只是对book元素进行匹配,找到book元素的id子元素而对book的其他元素不进行处理。使用了<xsl:apply-templates select=“version”/>元素后,xslt处理器还将从book的子元素version开始继续查找book的孙元素中的id元素进行转换。
3)<xsl:call-template>元素
<xsl:call-template>元素的作用是:请求一个指定的模板。上面已经提到<xsl:template>元素用于创建模板,在创建时如果用name属性给模板起个名字,那么就可以用<xsl:call-template>元素来对该模板进行调用;如果需要传递参数,则在模板建立时用子元素xsl:param,每一个xsl:param元素为一个参数,用name属性标明参数名称,而在调用时用xsl:with-param元素引入模板函数。下面是一个例子。
例3-15
建立模板:
<xsl:template name=“book”>
<xsl:param name=“id”/>
………………
</xsl:template>
调用模板:
<xsl:call-template name=“book”>
<xsl:with-param name=“id”/>
</xsl:call-template>
<xsl:value-of>元素
<xsl:value-of>元素可以用来选取XML元素以及把它添加到已被转换的输出流里中。如下所示:
<xsl:templatematch=“item”>
<b><xsl:value-of select=“title”/></b>
</xsl:template>
XSLT处理器首先找到item元素,<xsl:value-of>的select属性就获取title的内容,并将它插入htm l标记<b>中,select属性的值可以是xPath的位置路径。
4)<xsl:element>元素
<xsl:element>元素的作用是:在输出文档中创建一个元素节点。
例3-16
<xsl:for-each select=“booklist/book”>
<xsl:element name=“author”/>
</xsl:for-each>
上例给booklist的子元素book增加了一个名为author的子元素。
5)<xsl:attribute>元素
<xsl:attribute>元素的作用是:给元素添加属性。注意:如果<xsl: attribute>元素所要添加的属性在元素中已经存在,那么原来的属性将被<xsl:attribute>中添加的属性替换。
例3-17
<book>
<xsl:attribute name=“author”>
</book>
上例表示给book元素加上一个名为author的属性。
6)<xsl:comment>元素
<xsl:comment>元素的作用是:创建一个注释。
例3-18
<xsl:comment>This is a comment!</xsl:comment>
7)<xsl:for-each>元素
<xsl:for-each>元素的作用是:在指定的节点组中循环操作每个节点。
例3-19
<xsl:for-each select=“booklist/book”>
<tr>
<td><xsl:value-of select=“id”/></td>
<td><xsl:value-of select=“bookname”/></td>
<td><xsl:value-of select=“price”/></td>
</tr>
</xsl:for-each>
这样在booklist元素的所有book子元素将按照表格的形式在浏览器中进行输出。
8)<xsl:if>元素
<xsl:if>元素包含了一个模板。仅当制定的情况为true[真]时,才使用该模板。使用<xsl: choose>元素时,可以与<xsl:when>元素和<xsl: otherwise>元素一起使用来表达多个情况测试。
例3-20
<xsl:for-each select=“booklist/book”><xsl:if test=“price> 10”><tr>
<td><xsl:value-of select=“id”/></td>
<td><xsl:value-of select=“bookname”/></td>
<td><xsl:value-of select=“price”/></td>
</tr>
</xsl:if>
</xsl:for-each>
上例中只有price大于10的book元素才按照格式进行输出。
9)<xsl:copy>元素
<xsl:copy>元素的作用是:创建一个当前节点的复制版本。当前节点的命名空间节点也会被自动复制,但是当前节点中的子节点和属性将不会自动复制。
10)<xsl:sort>元素
<xsl:sort>元素的作用是:对输出文档进行排序。<xsl:sort>总是写在<xsl:for-each>元素(对每一个元素进行排序)或<xsl:apply-templates>元素(对选定元素的子元素进行排序)里。
例3-21
<xsl: for-each select=“booklist/book”>
<xsl:sort select=“id”order=“descending”>
<tr>
<td><xsl:value-of select=“id”/></td>
<td><xsl:value-of select=“bookname”/></td>
<td><xsl:value-of select=“price”/></td>
</tr>
</xsl: for-each>
上例的输出结果将按照book元素的子元素id的大小来排序,descending表示由大到小排序,如果是ascending,则表示由小到大排序。
3.XML Path Language
XPath是一种语言,一种节点位置的语言,用来描述XML元素的位置,就像电脑硬盘中的文件路径,它并不是一种查询语言。在实际使用过程中,XPath和XSLT总是混在一起使用,使用XSLT时XML文件中的元素进行操作,我们首先要明确元素的位置,而XPath就是可以帮助我们找到制定节点的定位指令。
XPath语言的主要目的就是描述节点相对其他节点的位置,也就是选择那些符合条件的节点,我们称为“位置路径”,位置路径的运算符见表3-18。
表3-18
根据上表所示的各个运算符,下面我们来具体举例说明它们的用法。
单独的“/”表示为XML的所有文件及根节点。如果要指定元素,我们可以用“/”指定出具体的元素。例如:/book/ file/ subject,这个例子中就指出了book这一根元素下的file子元素的subject子元素。//subject表示根元素下的所有subject元素,而/book//subject则表示book元素下的所有subject元素。“*”是用字符,从它的名字我们就可以看出来,它可以指代所有的元素和属性。例如“/book/*”就表示book元素下的所有的元素,“*/ subject”就表示所有元素的subject子元素。“@”可以帮助我们找到元素的属性,例如“/book@ price”表示book元素的price属性。对于一些特殊条件的查找,我们可以在[]中标出特殊的条件,例如“/book/file[2]”表示book子元素中的第二个file元素,“/book[@ price= 3]”表示所有具有price属性并且属性值为3的book元素。“|”可以帮助我们进行条件组合,例如“//book|// subject”表示所有的book和subject元素。
除了用这些运算符号来表述位置路径外,我们还可以用轴位置路径的方式来表示它,轴指明了节点之间的关系。具体的轴名称及说明见表3-19。
表3-19
轴位置路径的使用方式也非常简单,只要在路径之后使用“:”连接索引条件就可以了,下面通过几个例子说明它。例如:“//child∶∶file”表示所有子元素file,“/descendant-or-self∶∶book[@ price= 3]”表示book拥有price属性且属性值为3的所有下层元素,同时也包括book元素自身。
Xpath还为我们提供了一些函数,以帮助获取所需的元素,见表3-20。
表3-20
在这里,我们只是提到了最为简单的几个Xpath函数,有兴趣的同学可以自己去参考一些资料。接下来通过两个例子来了解这些函数简单的使用方式,例如“//*[count(file)= 3]”表示所有拥有三个file子元素的元素,“/book/file[position()= 2]”表示book的第二个file子元素。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。