XPointer,即XML指针语言(XML Pointer Language),在 2003 年 3 月 25 日 成为了W 3C 推荐使用的标准,用于显示XML文件中的特定位置及要素的规格。它可以通过URI引用XML文档的片段。XLink可以链接资源,通过把XPointer和XLink联合使用,就可以链接资源的任意部分,而不是整个资源。XPointer可以链接到特定位置,甚至可以链接XML文档中的某个位置范围。它还可以使用字符串来匹配搜索XML文档。
在HTML中,有一个类似于XPointer的标识<A NAME=…>,它的作用就是指明了可以链接到被<A>元素标识的位置,例如有一HTML文档link.html,如例9-18所示。
例9-18
<html>
<body>
<a name="section1">section1<br></a>
<a name="section2">section2<br></a>
<a name="section3">section3<br></a>
</body>
</html>
链接到该文档的HTML文档seclink.html如例9-19所示。
例9-19
<html>
<body>
<a href="link.html#section1">section1 here<br></a>
<a href="link.html#section2">section2 here<br></a>
<a href="link.html#section3">section3 here<br></a>
</body>
</html>
HTML
利用符号 # 指定了所要链接到的目标文档的锚点,浏览器便会定位显示出链接到目标文档的具体位置。读者可以在 link.html 文档的三个节中多添加些内容,以查看效果。但是使用 HTML 链接文档 HTML 锚点必须 先声明,还有声明的锚点必须链接到整个文档,这是使用 HTML 链接的缺点。使用XML的XPointer便会解决这些问题。完整形式的XPointer的形式为xpointer(表达式),其中表达式用于定位计算,得到需要的资源片断,所有的定位计算都基于一个已知节点,该节点称为上下文节点。一般而言,最初始的上下文节点总是文档中的确定位置,如文档的根节点(注意:根节点不是根元素,它是一个抽象的节点,是根元素的父节点,用"/"表示)、文档中具有确定ID值的元素(用函数id()表示)、当前元素(用函数here()表示)等。无修饰名称只有一个名称,表示文件中ID等于指定名称的元素,它提供了与HTML文件兼容的方式以定位文档片段。子节点序列由名称、一系列数字和"/"组成的序列,其中"/"用于分隔名称和数字,数字n表示前面定位元素的第n个直接子元素,子节点序列必须以"/1"或名称打头,表示该序列从根元素或指定ID的元素开始。实际上,后面两种形式都是第一种形式的简写,下面是几种形式的XPointer的例子。
1 xpointer(/child::sec/descendent::section[position()<=5])
2 xpointer(id("section")) 简写为:section
3 xpointer(/child::*[position()=1]/child::*[position()=2]) 简写为: /1/2
4 xpointer(id("loc")/child::*[position()=3]/child::*[position()=4]) 简写为:lo c/3/4
XPointer语言中的表达式是多个位置步形成的一个位置路径,每个位置步间用"/"分隔,前面位置步的运算结果构成后面位置步的上下文节点。位置步的形式为axis::node-test[prediates],它包括三个部分:
l axis 关键字,有且仅有一个,它表示结果节点与上下文节点的关系;
l node-test 节点测试,有且仅有一个,它表示结果节点的类型或名称;
l prediates 谓词,零到多个,它可以是用于限制结果的任意表达式。
xpointer表达式第一个例子中,第一个/表示文档的根节点,child::sec为第一个位置步,descendent::section[position()<=5]为第二个位置步,这两个位置步链接形成一个位置路径。在第二个位置步中,"descendent"是关键字,"section"是节点测试,"position()<=5"是谓词。该例子表示查找文档中sec子元素下的第1-5个section元素。
第二个例子表示查找id为section的元素,该例可以简写为section。
第三个例子中child::*[position()=1]为第一个位置步,*表示所有的子元素。child::*[position()=2]为第二个位置步。这个例子表示的是查找根元素的第1个子元素的第2个子元素。
第四个例子表示查找id为loc的元素的第3个子元素下的第4个子元素。
通过XPointer的几个例子,读者可能已经了解XPointer的基本结构及含义了,下面将给出一个具体的示例来介绍XPointer在XML文档中的基本用法。目标文档如例9-20所示。
例9-20
<?xml version="1.0"?>
<图书馆>
<图书 书名="C#技术内幕" id="1101">
<封面 url="http://www.itzcn.net/book/cover01.jpg" />
<出版社>机械工业出版社</出版社>
<简介>
这是一本C#编程语言的指南和参考书。C#是一种崭新的面向对象
的编程语言。它强调以组件为基础的软件开发方法。
</简介>
</图书>
<图书 书名="时间简史" id="5105">
<封面 url="http://www.itzcn.net/book/cover51.jpg" />
<出版社>湖南科学技术出版社</出版社>
<简介>
《时间简史》以最通俗的语言,对一些最古老的问题做了阐述,
向人们介绍了什么是宇宙论,以及宇宙论最新的发展状况。
</简介>
</图书>
<, /o:p>
</图书馆>
目标文档中定义了图书馆的两本图书,两本图书都有各自的id标识。链接文档如例9-21所示。
例9-21
<?xml version="1.0"?>
<图书借阅 xmlns:xlink="http://www.w3.org/1999/xlink">
<图书 xlink:type="simple"
xlink:href="http://www.itzcn.net/book/9-20.xml#xpointer(id('1101'))">
<描述 xlink:type="simple"
xlink:href="http://www.itzcn.net/book/cover01.jpg">
学习C#的书籍
</描述>
</图书>
<图书 xlink:type="simple"
xlink:href="http://www.itzcn.net/book/9-21.xml#xpointer(id('5105'))">
<描述 xlink:type="simple"
xlink:href="http://www.itzcn.net/book/cover51.jpg">
科技图书
</描述>
</图书>
</图书借阅>
链接文档描述了图书借阅的情况。链接类型为简单链接。例9-22第一个图书元素声明中
xlink:href="http://www.itzcn.net/book/9-20.xml#xpointer(id('1101'))">
通过属性xlink:href指定的目标文档9-20.xml使用XPointer链接到目标文档id为1101的元素,从而显示该元素所包含的信息。这一句可以简写为:
xlink:href="http://www.itzcn.net/book/9-21.xml#1101">