当听到样式表这个词时,您可能会想到 CSS 样式表。XSLT 样式表通常用于 xml 转换,比如在 Web 服务之间映射数据。因为 XSLT 非常适合此用途,所以创建了顶层元素 <stylesheet> 的 <xsl:transform> 别名,虽然这很少使用。这种 XSLT 转换的输入结构与输出结构有很大的不同。最重要的是,命名空间的不同。
XSLT 样式表的输入结构与输出结构相似,但却更简单些。其中已经扩充了一些标记,但大部分标记只是原样复制到输出。输入和输出的命名空间是相同的 (HTML)。输入文档也可以包含样式表指令(比如创建脚注),这些指令属于另一个命名空间,不会传递到输出中。
在本文中,我们将学习如何使用 XSLT 样式表扩充 XHTML 文档。文中的示例展示了如何使用指令,如何引用其他源文档的部分,以及如何使用链接在主文档中导航。此外,我们还探索了页面的解释和编译之间的区别。
XSLT 样式表不会阻止您使用其他技术,比如 javaScript 或 CSS。CSS 适用于字体、加粗、颜色、间距等。它不适合将来自不同位置的信息组合在一起,比如脚注、模块或生成一个目录。这正是 XSLT 的用武之地,它补充而不是替代了 CSS。
实际上,您可以将 XSLT 代码集中在一个文件中。为了简单起见,本文中的每个示例均位于一个独立的 XSLT 文件中,除了一些必要的代码。清单 1 给出了必需的代码。
清单 1. 必需的代码(位于 samples/common.xml 中)
12345678910111213141516171819202122232425262728 | < s:stylesheet
xmlns = "http://www.w3.org/1999/xhtml"
xmlns:h = "http://www.w3.org/1999/xhtml"
xmlns:a = "http://sourceforge.net/PRojects/arbalo/"
xmlns:s = "http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes = "a h"
version = "1.0" >
< s:template match = "h:head" >
< s:copy >
< s:apply-templates select = "@*|node()" />
< meta
http-equiv = "content-type"
content = "text/html;charset=UTF-8" />
< link
href = "common.css"
rel = "stylesheet"
type = "text/css" />
</ s:copy >
</ s:template >
< s:template match = "*" >
< s:copy >
< s:copy-of select = "@*" />
< s:apply-templates />
</ s:copy >
</ s:template > </ s:stylesheet > |
XHTML 的命名空间定义了两次:默认定义和 h:。默认命名空间用于编写输出 XHTML 标记,其中应该避免使用命名空间前缀。h: 用在 XPath 表达式中。
本文使用 XSLT 1.0 版本。目前,大部分浏览器都无法解释 XSLT 2.0。但是,如果 XSLT 运行在服务器上,那么它可能是一个实用的选择。XSLT 2.0 还提供了:
在 清单 1 中:
本文中的所有其他示例都是导入 common.xsl 的独立文件。
通过扩充,添加了一个未在源文档中显式请求的特性。一个示例是 清单 1 中的 CSS 样式表的链接。尝试另一个示例,向每个内部链接添加一个小箭头 (^ v),指明目标在它之前还是之后。清单 2 给出了该样式表。
清单 2. 样式表(在 samples/linkUpDown.xsl 中)
1234567891011121314151617181920212223 | < s:stylesheet
xmlns = "http://www.w3.org/1999/xhtml"
xmlns:h = "http://www.w3.org/1999/xhtml"
xmlns:s = "http://www.w3.org/1999/XSL/Transform"
version = "1.0" >
< s:import href = "common.xsl" />
< s:template match = "h:a[starts-with(@href,'#')]" >
< s:copy >
< s:copy-of select = "@*" />
< s:variable name = "name"
|