技巧:组合和替换 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处理指令是实现该任务的一种方法。

参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的英文原文
  • 原文出处:http://www.ibm.com/developerworks/cn/xml/x-tipstyl.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇