• 沒有找到結果。

(一)常用的 XSL 标记

样式表的基本结构就是模板,模板也是一种语言,模板中有一个重要的参数就是“match”, 该参数的值决定了哪些 XML 标记和该模板相匹配。

模板变换过程中,还可以使用许多重要的子孙标记,比如,前面用过的“xsl:value-of”标 记,“xsl:apply-templates”标记和“xsl:for-each”标记等。它们都可以作为模板标记的子标记,

而且这些 XSL 标记还可以形成父子关系。下面将陆续介绍这些 XSL 标记。

W3C 推荐(XSLT Version 1.0)的 XSLT 元素如表 4-1 所示。

注意,在表中:

 N:表示最早支持此标签的 Netscape 版本。

 IE:表示最早支持此标签的 Internet Explorer 版本。

在 IE5 中所支持的元素可能出现非标准的行为,这是由于 IE5 发布于 XSLT 被确立为正式 的 W3C 标准之前。

表 4-1 XSLT Version 1.0 的 XSLT 元素

元素 描述 IE N

apply-imports 应用来自导入样式表中的模板规则 6.0

apply-templates 向当前元素或当前元素的子元素应用模板 5.0 6.0

attribute 向元素添加属性 5.0 6.0

attribute-set 创建命名的属性集 6.0 6.0

续表

元素 描述 IE N

call-template 调用一个指定的模板 6.0 6.0

choose 与<when>以及<otherwise>协同使用,来表达多重条件测试 5.0 6.0

comment 在结果树中创建注释节点 5.0 6.0

copy 创建当前节点的一个备份(无子节点及属性) 5.0 6.0

copy-of 创建当前节点的一个备份(带有子节点及属性) 6.0 6.0

decimal-format 定义当通过 format-number() 函数把数字转换为字符串时,所要

使用的字符和符号 6.0

element 在输出文档中创建一个元素节点 5.0 6.0

fallback 假如处理器不支持某个 XSLT 元素,规定一段备用代码来运行 6.0

for-each 遍历指定的节点集中的每个节点 5.0 6.0

if 包含一个模板,仅当某个指定的条件成立时应用此模板 5.0 6.0

import 用于把一个样式表中的内容导入另一个样式表中 6.0 6.0

include 把一个样式表中的内容包含到另一个样式表中 6.0 6.0

key 声明一个命名的键 6.0 6.0

message 向输出写一条消息(用于错误报告) 6.0 6.0

namespace-alias 把样式表中的命名空间替换为输出中不同的命名空间 6.0

number 测定当前节点的整数位置,并对数字进行格式化 6.0 6.0

otherwise 规定 <choose> 元素的默认动作 5.0 6.0

output 定义输出文档的格式 6.0 6.0

param 声明一个局部或全局参数 6.0 6.0

preserve-space 用于定义保留空白的元素 6.0 6.0

processing-instruction 生成处理指令节点 5.0 6.0

sort 对结果进行排序 6.0 6.0

strip-space 定义应当删除空白字符的元素 6.0 6.0

stylesheet 定义样式表的根元素 5.0 6.0

template 当指定的节点被匹配时所应用的规则 5.0 6.0

text 通过样式表生成文本节点 5.0 6.0

transform 定义样式表的根元素 6.0 6.0

value-of 提取选定节点的值 5.0 6.0

variable 声明局部或者全局的变量 6.0 6.0

when 规定 <choose> 元素的动作 5.0 6.0

with-param 规定需被传入某个模板的参数的值 6.0 6.0

对于常见的标记的使用,将在下面分别举例说明。为了举例的方便,在没有特别指出的 情况下,将只给出 XSL 样式表文件的代码,而 XML 文件的代码,则基于下面的清单 4-1 中的

XML 文件代码清单。

清单 4-1 Atom.xml 文件的代码

<?xml version="1.0" encoding="utf-8"?>

<?xml-stylesheet type="text/xsl" href="14-2.xsl"?>

<PERIODIC TABLE>

<ATOM STATE="GAS">

<NAME>Hydrogen</NAME>

<SYMBOL>H</SYMBOL>

<ATOMIC_NUMBER>l</ATOMIC_NUMBER>

<ATOMIC_WLIGHT>1.00794</ATOMIC_WEIGHT>

<BOILING_POINT UNITS="Kelvin">20.28</BOILING_POINT>

<MELTING_POINT UNITS="Kelvin">13.81</MELTING_POINT>

<DENSITY UNITS="grdMS/cubic centimeter"><!- At 300K ->

0.0899

</DENSITY>

</ATOM>

<ATOM STATE="GAS">

<NAME>Helium</NAME>

<SYMBOL>He</SYMBOL>

<ATOMIC_NUMBER>2</ATOMIC_NUMBER>

<ATOMIC_WEIGHT>4.0026</ATOMIC_WEIGHT>

<BOILING_POINT UNITS="Kelvin">4.216</BOILING_POINT>

<MELTING_POINT UNITS="Kelvin">0.95</MELTING_POINT>

<DENSITY UNITS="grams/cubic centimeter"><!- At 300K ->

0.1785

</DENSITY>

</ATOM>

</PERIODIC_TABLE>

其中,样式表连接的语句:<?xml-stylesheet type="text/xsl" href="14-2.xsl"?>将根据不同的 例子而有所改变。

1.使用 xsl:value-of 标记 定义和用法:

<xsl:value-of> 元素可提取选定节点的值。

<xsl:value-of> 元素可用于选取某个 XML 元素的值,并把它输出。

注释:select 属性(必选)的值是一个 XPath 表达式。它的工作原理类似对文件系统的 定位,比如用一个斜杠来选择子目录。

语法:

<xsl:value-of select="expression" disable-output-escaping="yes|no"/>

属性:

属性 值 描述

select expression 必需。XPath 表达式,规定了从哪个节点/属性来提取值

disable-output-escaping yes no

默认值为“no”。如果值为“yes”,通过实例化<xsl:text>元 素生成的文本节点在输出时将不进行任何转义。如果设置为

“yes”,则“<”将不进行转换。如果设置为“no”,则被输 出为“&lt;”

“xsl:value-of”XSL 标记的格式如下:

<xsl:value-of select="标记匹配模式"/>

该 XSL 标记必须在模板中使用,作为模板的子标记。当“标记匹配模式”是特殊的“.”

号时,可以将<xsl:value-of select="."/>简写为<xsl:value-of />

xsl:value-of 元素把输入文档中的节点值复制到输出文档中。xsl:value-of 元素的 select 特 性指定正在获取的是哪个节点值。

例如,假设要将文字“An Atom”替换为由“NAME”子元素内容给出的“ATOM”元素 的名称,可用<xsl:value-of select="NAME"/>替换“An Atom”,如下所示:

<xsl:template match="ATOM">

<xsl:value of select="NAME"/>

</xsl:template>

然后,当将样式单应用于清单 4-1 时,产生如下文本。

<html><head/><body>

Hydrogen Helium

</body></html>

选择其值的项目(本例中的 NAME 元素)是与源节点有关的。源节点是由模板来匹配的 项目(本例中特指“ATOM”元素)。因此,当氢(Hydrogen)的 ATOM 与<xsl:template match=

"ATOM">相匹配,氢(Hydrogen)的 ATOM 的 NAME 元素就由 xsl:value-of 选定了。当氦(Helium)

的 ATOM 与<xsl:template match= "ATOM">相匹配时,氦(Helium)的 ATOM 的 NAME 元素 就由 xsl:value-of 选定了。

节点的值总是字符串,有时可能为空字符串。此字符串的精确内容由节点的类型而定。

最普通的节点类型为元素,元素节点的值特别简单,就是在元素的开始标记和结束标记之间的 所有可析字符数据(但不是标记!)。例如,清单 4-1 中的第一个 ATOM 元素如下所示.

<ATOM STATE="GAS">

<NAME>Hydrogen</NAME>

<SYMBOL>H</SYMBOL>

<ATOMIC_NUMBER>l</ATOMIC_NUMBER>

<ATOMIC_WEIGHT>1.00794</ATOMIC_WEIGHT>

<OXIDATION_STATES>1</OXIDATION_STATES>

<BOILING_POINT UNITS="Kelvin">20.28</BOILING_POINT>

<MELTING_POINT UNITS="Kelvin">13.81</MELTING_POINT>

<DENSITY UNITS="grams/cubic centimeter"><!- At 300K ->

0.0899

</DENSITY>

</ATOM>

元素的值显示如下:

Hydrogen H 1 1.00794 1 20.28

13.81 0.0899

通过删除所有的标记和注释后计算出了这些值。包括空格在内的其他一切内容都完整无 缺地保留着。其他六个节点类型的值也可以类似的非常明显的方式加以计算。总结了这些值的 结果填入下表。

节点类型 值

根节点 根元素的值

元素 包括在元素中的所有可析的字符数据(包括元素的任何后代中的字符数据)

文本 节点的文本,实际上为节点本身

属性 标准化的属性值(详细说明见 XML 1.0 推荐的 3.3.3 节);主要为实体还原后的

属性值,截去前导和后继的空格;不包括属性名、等号或引号 命命名空间 用于命命名空间的 URL

处理指令 处理指令的值,不包括<?或?>以及处理指令名

注释 注释文本,不包括<!--和-—>

2.使用 xsl:for-each 标记 定义和用法:

<xsl:for-each> 元素可遍历指定的节点集中的每个节点。

语法:

<xsl:for-each select="expression">

<!-- Content:(xsl:sort*,template) -->

</xsl:for-each>

属性:

属性 值 描述

select expression 必需。被处理的节点集

xsl:value-of 元素只用于能够不含糊地确定要获取哪个节点值的上下文中。如果有多个可 能项可供选择,那么只选择第一项。例如,由于普通的“PERIODIC_TABLE”元素包含一个 以上的“ATOM”,所以下列的规则较差。

<xsl:template match="PERIODIC_TABLE">

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

</xsl:template>

有两种方法可依次处理多个元素。第一种方法已经看到了,只需要按下列方式与 select 属性(它选择想要包括的特定元素)一起使用 xsl:apply-templates。

<xsl:template match="PERIODIC_TABLE">

<xsl:apply-templates select="ATOM"/>

</xsl:template>

<xsl:template match="ATOM">

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

</xsl:template>

第二个模板中的 select="."告诉格式化程序取匹配的元素(本例中的“ATOM”)的值。

第二种方法是使用 xsl:for-each。xsl:for-each 元素依次处理由 select 属性选择的每个元素。

不过,无需任何附加的模板。例如:

<xsl:template match="PERIODIC_TABLE">

<xsl:for-each select="ATOM">

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

</xsl:for-each>

</xsl:template>

如果省略 select 特性,那么处理源节点(本例中的“PERIODIC_TABLE”)的所有子节点。

<xsl:template match="PERIODIC_TABLE">

<xsl:for-each>

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

</xsl:for-each>

</xsl:template>

3.使用 xsl:element 标记

通常,只使用文字元素本身就可以将元素插入到输出文档中。例如,要插入 P 元素,只 需要在样式单的适当位置键入<P>和</P>。但是,偶尔也需要使用输入文档的详细内容,来确 定将哪个元素放在输出文档中。例如,当将使用特性来提供信息的源符号集变换成使用元素来 提供相同信息的输出符号集时,就是这种情况。

xsl:element 元素将元素插入到输出文档中。元素名由 xsl:element 元素的 name 属性中的属 性值模板给出。元素的内容来自于 xsl:element 元素的内容,此元素可能包括要插入这些项的 xsl:attribute、xsl:pi 和 xsl:comment 指令(下面讨论所有的指令)。

假设根据 STATE 特性的值,要用“GAS”、“LIQUID”和“SOLID”元素来代替“ATOM”

元素。使用 xsl:element 将“STATE”属性值转换为某个元素名,从而只需要一条规则就可以 做到这一点。具体作法如下所示。

<xsl:template match="ATOM">

<xsl:element name="{@STATE}">

<NAME><xsl:value-of select=”NAME”/></NAME>

<!- rules for other children ->

</xsl:element>

</xsl:template>

使用更为复杂的属性值模板,就可以实现所需的大多数运算。

4.使用 xsl:attribute 标记

只使用文字属性,就可以将属性包括在输出文档中。例如,要插入带有 ALIGN 属性(其 值为 CENTER)的 DIV 元素,只需在样式单的适当位置处键入<DIV ALIGN="CENTER">和

</DIV>即可。但是,为了确定属性值,有时甚至是为了确定属性名,常常不得不依赖于从输 入文档中读取的数据。

例如,假设要获得一样式单,可选择原子(ATOM)名,并把这些原子(ATOM)名格式 化为与 H.html、He.html、Li.html 等文件的链接:

<LI><A HREF="H.html">Hydrogen</A></LI>

<LI><A HREF="He.html">Helium</A></LI>

<LI><A HREF="Li.html">Lithium</A></LI>

在输入文档中,每个不同的元素都有一个不同的 HREF 属性值。xsl:attribute 元素计算属

相關文件