XSLT句法与函数

4.3.4 XSLT句法与函数
   

从前面的例子中,相信读者已经大概了解了XSLT的一般形态及功能。在这一小节里,我们再来综合地论述一下。

  1. 文档结构

前面说过,XSLT文档本身是XML文档,因此文档的第一句自然是:

<?xml version="1.0" ?>

接下来是样式单部分:

<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源文档树,找到要处理的节点,然后将定义好的模板信息施加到该节点中。

  1. 模板及应用

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为优先级数
  1. 计算节点值

在使用XSLT进行转换时,常常需要获取节点值,使用xsl:value-of元素可达到这个目的,如下例:

<xsl:value-of select="origin"/>

得到的是学生原籍的值,select属性指定要获取的是哪一个节点的节点值。

  1. 循环处理

使用xsl:for-each可对所选节点依次进行处理,如例中在生成表格处理中,就是利用循环将各个学生的信息取出放入表格中的,写法是:

<xsl:for-each select="student" order-by="name"> …</xsl:for-each>
  1. 排序

对于用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">

也可使得输出学生时按名字排序。

  1. 元素与属性创建

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>
<!-- 以下是学生花名册,请勿删改!-->
  1. 节点拷贝

在对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>

由此可见,两种拷贝方式结果大相径庭。

  1. 输出格式与编码问题

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格式,编码方式为中文。

你可能感兴趣的:(XSL)