Vincent.Chan‘s Blog

常用链接

统计

积分与排名

网站

最新评论

技巧:组合和替换 xml-stylesheet 处理指令::为不同用户提供不同视图

级别: 中级

Elliotte Rusty Harold, 副教授, Polytechnic University

2005 年 8 月 18 日

在文档序言中插入多个 xml-stylesheet 处理指令,为不同用户提供不同的视图。本文还将说明如何包括伪属性来调整表示。

把内容与表示分离是 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 开发人员来说,这一功能没有多少用处。





回页首


结束语

XML 的最初目标之一是将内容与表示分离。它允许对同一文档应用多个样式表,从而为不同的用户提供不同的视图。在文档中添加多个 xml-stylesheet 处理指令是实现该任务的一种方法。





回页首


参考资料





回页首


关于作者


Elliotte Harold 出生在新奥尔良,现在,他还定期回老家喝一碗美味的秋葵汤。不过目前,他与妻子 Beth 定居在纽约临近布鲁克林的 Prospect Heights,与他们住在一起的还有猫咪 Charm(取自夸克)和 Marjorie(按照他岳母的名字)。他是 Polytechnic 大学计算机科学的副教授,讲授 Java 技术和面向对象编程。他的 Cafe au Lait 网站是 Internet 上最受欢迎的独立 Java 站点之一,姊妹站点 Cafe con Leche 是最受欢迎的 XML 站点之一。他的著作包括 Effective XMLProcessing XML with JavaJava Network ProgrammingThe XML 1.1 Bible 。他目前正在研究处理 XML 的 XOM API 和 Jaxen XPath 引擎。

posted on 2006-03-21 23:27 Vincent.Chen 阅读(180) 评论(0)  编辑  收藏 所属分类: XML


只有注册用户登录后才能发表评论。


网站导航: