### XML 技术指南(3)

举个例子说，假如你想找到所有的 lowfat hamburger price 元素。为了用标准的 DOM API 来完成这一切，你必须通过手工地书写代码遍历整颗树来找寻符合条件的元素（在本例中，条件是指在 hanburger 元素中 lowfat=yes 的 price 元素）。再看另一个例子，假设你想将所用的 hamburger 元素和相关的数据转换为简单的 HTML 表格以供用户交互使用。使用标准的 DOM API，你得手工遍历整棵树来获得 HTML 表格中所需的数据。
我为了标准化及简化人们完成这些任务所需做的工作，W3C 推荐使用 XSL（Extensible Stylesheet Language）和一种叫做 XSL Patterns 的简单查询语言。
XSL Patterns
一个模式就是一个字符串，通过它来选取 XML 树中的节点。这样的选取取决于模式所关连的当前节点。元素的名字是最简单的模式，这个模式选取了当前节点所有具有该名字的子节点。例如，hamburger 模式选取了当前节点的所有 hamburger 子节点。
模式的语法非常完备。它允许你标识某个指定元素在文档中所处的上下文（例如，price 元素在 hamburger 元素之中），同时它还提供了强大的筛选句法，使得我们可以标识出符合给定条件的节点（例如，lowfat=yes）。为了找出一个 hamburgers 元素中的所有 lowfat hamburger price 元素，你可以使用以下的模式字符串：
/hamburgers/hamburger[@lowfat="yes"]/price
当某个模式被应用于给定的节点时，它仅返回符合指定模式的节点列表。这大大简化了开发者的操作，不再需要遍历整棵树。
MSXML 2.0 对模式语法的支持和 Extensible Stylesheet Language (December 18th Working Draft)中 2.6 节的定义是相同的。MSXML 2.0 中的 IXMLDOMNode 接口提供了两个方法，SelectNodes 和 SelectSingleNode。这两个方法都以一个模式串为参数。例如，下面的一行代码将返回满足条件的所有 price 节点。
Set nodeList = rootNode.selectNodes("hamburger[@lowfat="yes"]/price")
XSL
XSL 模式可以帮助我们标识一篇给定 XML 文档中的某些节点，但对这些节点的操作最终还是有赖于开发者来完成。XSL 可以帮助我们简化完成通常 XML 任务的过程：将 XML 节点从一种格式转化到另一种格式。这种对格式转化的需求起源于 Web 开发者需要将他们的 XML 数据转化为 HTML 数据以供用户浏览。
实际上，XSL 所能做得远比以上描述多得多。XSL 能够有效的定义从一种 XML 格式到另一种 XML 格式之间的转换，这极大的增强了互操作性。假如某个人向你的系统发送了一篇 XML 文档，而你的系统不认识它所采用的 XML 词汇，你只要进行一次简单的 XSL 转换就可以得到自己熟悉的词汇。正是由于 XML 这种简单的特点，开发者才不用为了描述某种类型的数据而采用通用的词汇。
一个 XSL 文件中包含了一系列定义转换规则的声明模板。每一个模板都明确定义了怎样将源文档中的指定节点转换为输出文档中的节点（或其它类型的数据）的方法。你可以使用 XSL 模式来决定一个模板应用于一篇文档中的那些部分。
作为一个示例，下面转换 hamburger XML 文件：
<?xml version="1.0"?>
<hamburgers>
<hamburger lowfat="dream on">
<name>CowBurger</name>
<description>Greasy and good.</description>
<price>2.99</price>
</hamburger>
</hamburgers>
转换到 HTML 文件：
<html>
<body>
<h1>hamburgers</h1>
<ol>
<li>CowBurger, $2.99, Greasy and good.</li>
</ol>
</body>
</html>
你使用的 XSL 文件如下：
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" http://www.w3.org/TR/WD-xsl ">
<xsl:template match="/">
<html>
<body>
<h1>hamburgers</h1>
<xsl:for-each select="hamburgers[@lowfat="dream on"]>
<li><xsl:value-of select="name"/>, <xsl:value-of select="price"/>,
<xsl:value-of select="description"/></li>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
注意到了吗，我们是怎样在不同 XSL 元素的 match 和 select 属性中使用 XSL 模式来标识元素集的？在<xsl:template>标签中定义了一组节点的转换规则。XSL 使用了一套标准的 XML 词汇来定义转换的过程，是不是很有趣呢？
链接技术
很多人都认为，HTML 真正强劲的地方在于它的锚元素。
<A HREF = "http://www.someserver.com">some link</A>
锚元素使开发者可以建立从一个 HTML 页面到另一个页面的链接，定义两个文档之间的关系。这给用户提供了一种从当前页面中获取更多相关数据的途径。同时，这也是用户在查询数据中所使用的典型方法。为了查找数据，他们浏览某一页面，同时他们在这篇该页面中可能会发现更符合他们要求的内容。而这些内容通过一个链接，存放在不同的页面上。
整个 Web 就是基于这样一个在不同的数据文件之间建立关系（链接）的基石上的。随着 IT 行业不断的向前发展，我们自然会想到用类似的机制来描述不同 XML 文档或是相同文档中不同元素之间的联系。
XLink
XML Linking 1.0 (XLink)是 W3C 主导的定义 XML 链接的语法。根据 XLink 1.0 文档的要求，一个 XML 链接，或 XLink 的描述信息，显式的指定了资源或部分资源之间的关系。在 XLink 中，我们并不涉及标示不同类型数据位置的方法（例如 URIs、XPointers 和图形坐标）。
这里是一个 XML 连接的简单例子：
<hamburger xml:link="simple" HREF =
"http://fastfood.org/hamburger.asp">
</hamburger>
XPointer
在前面的章节中你已经读到，XLink 需要依靠不同的机制来标识你想要链接的资源（例如统一资源标识符）。W3C 推出了另一种叫做 XPointer 的机制用于构造 XML 文档的内部结构。具体地说，它决定了一篇 XML 文档中的元素、字符串或其它部分是否具有某个具体的标识。
一个 XPointer 包括一系列描述位置的术语，它们中的任何一个都指定了一个特定的位置信息，通常这样的位置信息总是和前一个术语所指定的位置信息相关联。每一个位置术语都有一个关键字（例如 id，child，ancestor 等等）和若干变量，诸如实例的序列号、元素类型或属性。看下面的例子：
child(2,hamburger)
指的是第二个类型为 hamburger 的元素。
其他 XML 相关的技术和词汇
目前为止我们所谈到的已经代表了 XML 的核心技术。可能你觉得这些东西已经足够了，但如果我们不深入下去对眼下一些正流行起来的 XML 相关技术和词汇作一些介绍的话，这篇文章探讨 XML 的文章就显得不是很完整了。目前，这些新技术正在 W3C 的开发小组的努力下一步步走向成熟。
MathML(Mathematical Markup Language)
MathML 是一种用来描述数学符号、纪录其结构和内容的 XML 应用。MathML 的目标是在 Web 上实现能像 HTML 处理文本一样，处理数学问题。下面是由 W3C 提供的的 MathML 例子。数学方程：
x2 + 4x + 4 =0
在 MathML 中可以用以下的 XML 词汇表示：
<apply>
<plus/>
<apply>
<power/>
<ci>x</ci>
<cn>2</cn>
</apply>
<apply>
<times/>
<cn>4</cn>
<ci>x</ci>
</apply>
<cn>4</cn>
</apply>
SMIL
SMIL(Synchronized Multimedia Integration Language，它的发音和"smile"一样)是一种基于 XML 的表述多媒体演示的语言。SMIL 允许将一组独立的多媒体对象整合为一个多媒体演示。作为另一种行业趋势，HTML+TIME 依靠 SMIL 功能在你的 HTML 页面中加入多媒体"时间"特性。现在 IE 5 提供了一个 HTML+TIME 的实现。下面例子中的页面中包含了一个时间序列。位于时间段中的每一个 P 元素会等到前一个 P 元素消失后再出现。