把内容与表示分离是 XML 的一个主要目标,XML 完美地实现了这一目标。一个文档并不限于只使用一个样式表,可以针对不同读者和环境提供多个样式表。本文将说明如何在 XML 文档序言中包含多个 xml-stylesheet 处理指令,这些指令分别指向用于不同上下文的不同样式表。
xml-stylesheet 处理指令
多数 XML 开发人员都非常熟悉 xml-stylesheet 处理指令:
<?xml-stylesheet type="text/css" href="mystyles.css"?>
将该指令放在 XML 文档的序言中,在浏览器中打开该文档时,浏览器就会从相对的 URL mystyles.css 中加载样式表,并用它格式化文档和显示。这种功能得到了基本上所有现代 Web 浏览器的支持,除了 Lynx 以外。
但不那么众所周知的是,并不限定您只使用一个样式表。序言中可以包括多个 xml-stylesheet 处理指令。如果其中有多个指令指向 CSS,那么可以将每个样式表中的规则组合在一起。这种行为非常适合模块化。比如,可以导入一个样式表来处理文档中数学方面的样式,并导入另一个样式表来设置文档中的文本样式:
<?xml-stylesheet type="text/css" href="mathstyles.css"?>
<?xml-stylesheet type="text/css" href="textstyles.css"?>
如果有两个(或更多)样式表中的样式规则发生了冲突,那么序言中最后出现的那个样式表将优先考虑。
使用指向不同 XSLT 样式表或者同时包含指向 XSLT 样式表和 CSS 样式表的 xml-stylesheet 处理指令也是可能的。但是,我不建议这样做。浏览器是不一致的,甚至无法预测会选择哪一个样式表,虽然通常不会优先选择 XSLT 样式表。
alternate 伪属性
为了更容易理解一些,可使用 alternate 和/或 media 伪属性。alternate 伪属性的值可以是 yes 或 no:如果是 yes,那么处理指令引用的替换样式表只在用户要求时才会加载;否则处理指令引用的样式表就是默认加载的基本样式表。
比如,下面两个处理指令规定了默认表示和大字体的替代表示:
<?xml-stylesheet type="text/css" href="regular.css"?>
<?xml-stylesheet type="text/css" href="bigfonts.css"
alternate="yes"?>
这样做的时候还要包括 title 伪属性,该属性将告诉用户如何对样式表进行区分。比如:
<?xml-stylesheet type="text/css" title="Regular fonts"
href="regular.css"?>
<?xml-stylesheet type="text/css" title="Extra large title fonts"
href="bigfonts.css" alternate="yes"?>
浏览器应该允许用户选择使用哪一种样式表。对于 Mozilla 和 Firefox,可以在 View > Page Style 菜单中找到该选项。Microsoft® Internet Explorer 和 Safari 没有提供该选项(使用默认样式表)。
