当听到样式表这个词时,您可能会想到 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:stylesheetxmlns="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()"/><metahttp-equiv="content-type"content="text/html;charset=UTF-8" /><linkhref="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:stylesheetxmlns="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" 
 |