把内容与表示分离是 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 没有提供该选项(使用默认样式表)。
media 伪属性
xml-stylesheet
处理指令还可以使用media
伪属性,表明样式表适用的环境。比如,可以用一个样式表格式化文档,在一般的桌面或膝上监视器上显示文档,并用另一个样式表在纸上打印该文档,第三个样式表则将文档投影到面对听众的墙上。下面的文档序言提供了所有这三种样式选择:
<xml version="1.0"?> <?xml-stylesheet type="text/css" media="screen" title="Regular fonts" href="regular.css"?> <?xml-stylesheet type="text/css" media="projection" title="Extra large fonts" href="bigfonts.css" alternate="yes"?> <?xml-stylesheet type="text/css" media="print" title="Smaller fonts" href="smallfonts.css" alternate="yes"?>
在这种情况下,浏览器应该自动选择适当的样式表,不需要更多的用户干预。
media
伪属性定义了 8 个值:
-
screen
—— 最常见,现代桌面或膝上计算机的显示器。 -
tty
—— 定宽的终端,如 VT-100s 和 X-terms,适合于 Lynx。 -
tv
—— WebTV 或者类似的技术。 -
projection
—— 投影到大屏幕上。 -
handheld
—— PDA、蜂窝电话和类似的小屏幕设备。 -
print
—— 纸张。 -
braille
—— 盲文屏幕读者。 -
aural
—— 声音屏幕读者。
media伪属性的值之间用逗号分隔。比如,以下xml-stylesheet
处理指令表示样式表可用于手持设备和具有更大位图显示设备的计算机:
<xml-stylesheet type="text/css" media="handheld,screen" href="styles.css"?>
此外,还可使用media="all"
表示样式表适用于所有媒体。(如果没有出现media
伪属性,则该属性为默认属性。)当然,浏览器可能忽略不能理解的样式规则。即使font-size: 14pt
出现在media="aural"
的样式表中,屏幕浏览器也会忽略它。
最后,还可以为这个伪属性定义新的、自定义的值。比如,可使用three-d
这样的值来引用一个用于显示器的样式表,该显示器使用两个嵌套 LCD 面板来表示三维图像。但是,不是所有浏览器都能识别这个值。这一功能吸引的主要是浏览器厂商,他们可以定义自定义的值来识别自己使用的扩展,对单个 Web 开发人员来说,这一功能没有多少用处。