从前面的例子中,相信读者已经大概了解了XSLT的一般形态及功能。在这一小节里,我们再来综合地论述一下。
- 文档结构
前面说过,XSLT文档本身是XML文档,因此文档的第一句自然是:
接下来是样式单部分:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
… …
</xsl:stylesheet>
|
也可以写作:
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
… …
</xsl:transform>
|
xsl:transform与xsl:stylesheet具有相同的含义,都表示元素所包含的内容为样式单。xsl:stylesheet元素必须包含有"version"属性,用以指示该XSL文档遵从哪一个版本的XSL标准。另外,xmlns:xsl指示了XSL的命名空间,在XSLT标准中,定义了XSLT的命名空间为http://www.w3.org/1999/XSL/Transform。
XSLT在进行转换时,首先遍历XML源文档树,找到要处理的节点,然后将定义好的模板信息施加到该节点中。
- 模板及应用
xsl:template是模板元素,通常每个xsl:template有一个节点匹配属性,由"match="指定。在对模板进行匹配时使用"xsl:apply-templates",选择要匹配的模板,相当于一个调用的过程。对节点的匹配规则遵照XPath。
不同的模板设计,可以导致同一个文档有不同的输出效果。xsl:template元素有一个mode属性,可以根据需要去匹配不同模式的模板。若将前例作如下修改:
<xsl:template match="/" mode="blue">
…
<TITLE>学生花名册</TITLE>
<STYLE> .title{font-size:15pt; font-weight:bold; color:blue }
…
<xsl:template match="/" mode="red">
…
<TITLE>学生花名册</TITLE>
<STYLE> .title{font-size:15pt; font-weight:bold; color:red }
…
|
如果要将TITLE输出为蓝色,则用下面语句匹配:
<xsl:apply-templates select="/" mode="blue"/> |
如果要将title输出为红色,则写为:
<xsl:apply-templates select="/" mode="red"/> |
此外,模板总是与节点相对应的,一个节点可能对应于不同的模板,那么如何确定各模板匹配的先后次序呢?XSLT中可为xsl:template设置优先级,写法是:
<xsl:template match="student" priority="n"> //n为优先级数 |
- 计算节点值
在使用XSLT进行转换时,常常需要获取节点值,使用xsl:value-of元素可达到这个目的,如下例:
<xsl:value-of select="origin"/> |
得到的是学生原籍的值,select属性指定要获取的是哪一个节点的节点值。
- 循环处理
使用xsl:for-each可对所选节点依次进行处理,如例中在生成表格处理中,就是利用循环将各个学生的信息取出放入表格中的,写法是:
<xsl:for-each select="student" order-by="name"> …</xsl:for-each> |
- 排序
对于用xsl:for-each或xsl:apply-templates匹配的节点,可使用xsl:sort将所选节点内容进行排序,如:
排序方式
|
举 例
|
含 义
|
按大小写排序 |
<xsl:sort case-order="upper-first" select="@id"/> |
以id为关键字按大写优先排序 |
<xsl:sort case-order="lower-first" select="@id"/> |
以id为关键字按小写优先排序 |
按字母顺序排序 |
<xsl:sort order="ascending" select="@id "/> |
以id为关键字按字母升序排序 |
<xsl:sort order="descending" select="@id "/> |
以id为关键字按字母降序排序 |
按数据类型排序 |
<xsl:sort data-type="text" select="@id"/> |
以id为关键字按文本类型排序,如对于一组id数据101,2,44,305来说,排序结果是101,2,305,44 |
<xsl:sort data-type="number" select="@id"/> |
以id为关键字按数据类型排序,上面一组数据的排序结果是2,44,101,305 |
另外,还有一种指定排序的方法,就是在前面学生花名册例中所使用的order-by:
<xsl:for-each select="student" order-by="name"> |
也可使得输出学生时按名字排序。
- 元素与属性创建
XSLT是一个动态的样式单,在处理过程中可产生新的元素或元素属性,方法如下:
内 容
|
元 素
|
举 例
|
转换结果
|
创建元素 |
xsl:element |
<xsl:element name="TITLE">
学生花名册
</xsl:element>
|
<TITLE>学生花名册</TITLE> |
创建属性 |
xsl: attribute |
<TITLE>
<xsl:attribute name="style">
color:blue
</xsl:attribute>
学生花名册
</TITLE >
|
<TITLE style="color:blue">
学生花名册
</TITLE>
|
创建文本 |
xsl:text
(可以保护文本中的空白字符)
|
<xsl:text>
这是学生花名册
</xsl:text >
|
输出文字:
这是学生花名册
|
创建处理指令 |
xsl:processing-instruction |
<xsl:processing-instruction name="xml-stylesheet">
href="book.css"
type="text/css"
</xsl:processing-instruction>
|
<?xml-stylesheet href="book.css" type="text/css"?>
|
创建注释 |
xsl:comment |
<xsl:comment>
以下是学生花名册,请勿删改!
</xsl:comment>
|
<!-- 以下是学生花名册,请勿删改!--> |
- 节点拷贝
在对XML文档进行处理时,XSLT还可以通过拷贝的方式复制节点,方法是利用xsl:copy和xsl:copy-of。其中xsl:copy只拷贝当前节点,不包括子节点和属性;而xsl:copy-of的拷贝内容则包括当前节点、子节点和属性。例如对于:
<p id="p1">A <B>is a char</B> </p> |
如果样式单写为如下形式:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="p">
<DIV>
<xsl:text> copy-of : </xsl:text>
<xsl:copy-of select="."/>
</DIV>
<DIV>
<xsl:text> copy : </xsl:text>
<xsl:copy/>
</DIV>
</xsl:template>
</xsl:stylesheet>
|
转换后生成如下代码:
<DIV>
copy-of : <p id="p1">A <B>is a char</B> </p>
</DIV>
<DIV>
copy : <p/>
</DIV>
|
由此可见,两种拷贝方式结果大相径庭。
- 输出格式与编码问题
XSLT是一个转换语言,它的目的是将XML源文档转换为另一种格式文档,它的输出结果可以是HTML文档,也可以是带CSS的XML文档。具体的输出格式由xsl:output 指定。如果要输出为HTML文档,则写为:
<xsl:output method="html"/> |
同样,要输出XML文档写为:
<xsl:output method="xml"/> |
如果文档中不出现xsl:output,将缺省输出为XML文档,但如果在匹配模板时使用了<HTML>标记,则输出为HTML文档。输出为HTML文档时系统都会自动加上下面语句:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
此外,还可以利用xsl:output指定编码方式,如UTF-8,UTF-16,GB2312等。例如:
<xsl:output method="html" encoding="GB2312"/> |
它指定了该XSLT的输出结果是HTML格式,编码方式为中文。