级别: 初级
Brett McLaughlin, Enhydra 策略顾问, Lutris Technologies
2001 年 7 月 01 日
本技巧文章介绍 XPointer,并讨论如何将它与 XLink 一起使用,以引用另一篇文档的特定部分。
在本技巧文章中,我希望以拙作
使用 XML 和 XLink
技巧一文中演示的为基础。XLink
虽然有用,但只允许引用另一篇文档。但在很多时候,您都要引用另一篇文档的特定
部分。要做到这点很简单。这有些类似于在 HTML
中使用命名锚点,可以通过在 XLink 上使用 XPointer
来完成。这两个被设计成协同工作的规范十分自然地互为基础。本技巧文章将演示如何在
XML 中使用 XPointer 来引用文档的某一部分。
要引用文档的一部分,首先要看一下将要链接到的
目标文档。如果可以,请确保该文档使用
id
属性。这将使链接和定位更容易。“清单
1”显示了吉他工匠 Dana Bourgeois
制造的吉他清单,并包括每种类型的标识。
注:为清晰起见,将 Bourgeois 吉他的 URL 由实际
URL http://www.bourgeoisguitars.com 改成较短的 URL
http://bg.com。这使代码清单更易于阅读。如果要实际看到这篇文档,请将对
http://bg.com 的引用改回
http://www.bourgeoisguitars.com。
清单 1. Bourgeois 吉他清单
<?xml version="1.0"?>
<guitarTypes xmlns="http://bg.com"> <type model="OM" ID="OM"> <picture url="http://bg.com/images/vvOM.jpg" /> <description>Small bodied orchestra model.</description> </type> <type model="D" ID="D"> <picture url="http://bg.com/images/ricky%20skaggs%20model.jpg" /> <description> Bluegrass powerhouse in a standard dreadnought shape. </description> </type> <type model="slopeD" ID="slopeD"> <picture url="http://bg.com/images/slope%20d,%20custom%20version.jpg" /> <description> Slope shouldered dreadnought, perfect for vocal accompaniment. </description> </type> </guitarTypes>
|
对于本技巧文章,假设此文档位于
http://bg.com/guitars.xml
。XPointer 不引用整篇文档 -
那没有多大用处,它允许您链接到文档的特定部分。还记得 XLink 文章中的
xlink:href
属性吗?为那个属性提供的值是 XLink
的目标。但是要引用该页面的一部分,可以向这些 URL 中添加一个井号 (#)
和一个 XPointer 表达式。例如,表达式
xpointer(id("slopeD"))
引用文档中带有 ID "slopeD"
的元素。因此,可以使用
http://bg.com/guitars.xml#xpointer(id("slopeD"))
引用“清单 1”中所示的 XML,然后是那个文档中所描述的 Slope D
型号的吉他。很简单,是吗?下面为您显示我在 XLink
技巧文章中引入的描述吉他的 XML 文档修订版,它现在使用一些 XPointer
引用。
清单 2. 在 XML 文档中使用
XPointer
<?xml version="1.0"?>
<guitars xmlns="http://www.newInstance.com/about/guitars" xmlns:xlink="http://www.w3.org/1999/xlink"> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href= "http://bg.com/guitars.xml#xpointer(id('OM'))"> <description xlink:type="simple" xlink:href= "http://newInstance.com/guitar/bgOM/pics/bougOM_front_full.jpg" xlink:actuate="onLoad" xlink:show="embed"> This is a real beauty in a small body. Although this is an OM, I use it for flatpicking bluegrass as well as for producing some beautiful fingerstyle sounds. </description> </guitar> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href= "http://bg.com/guitars.xml#xpointer(id('D'))"> <descripton xlink:type="simple" xlink:href= "http://newInstance.com/guitar/bgD150/pics/bougd150_con_rim2.jpg" xlink:actuate="onLoad" xlink:show="embed"> Here's the holy grail in process. Dana Bourgeois is building this Brazilian rosewood and adirondack bluegrass monster right now. You'll know it's finished when you hear a run and your windows shatter! </description> </guitar> </guitars>
|
现在,我的文档可以引用 Dana Bourgeois 保留的有关他的吉他的 XML
内容。即便他更改了此信息,我也无需担心;我的文档始终是最新的,因为它只链接到他更新过的信息。请注意,在上述代码中,必须使用
&
而不是“和”符号(“&”)来转义 XPointer
表达式中的引号。这会使连接的 URL 相当长,而长 URL
可以导致讨厌的输入错误。对于我们来说幸运的是,在链接到带有 ID
标记的元素时,XPointer 允许使用方便的简写形式。除了使用
xpointer(id("D"))
形式,您还可以使用 ID
的值来定位。在这种情况下,那将是 "D"。这样,我就可以将“清单
2”中的文档简化成“清单
3”中所示的文档,该文档中的连接语法更清晰。
清单 3. 使用 ID 链接的 XPointer
简写形式
<?xml version="1.0"?>
<guitars xmlns="http://www.newInstance.com/about/guitars" xmlns:xlink="http://www.w3.org/1999/xlink"> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href="http://bg.com/guitars.xml#OM"> <descripton xlink:type="simple" xlink:href=" http://newInstance.com/guitar/bgOM/pics/bougOM_front_full.jpg" xlink:actuate="onLoad" xlink:show="embed"> This is a real beauty in a small body. Although this is an OM, I use it for flatpicking bluegrass as well as for producing some beautiful fingerstyle sounds. </description> </guitar> <guitar luthier="Bourgeois" xlink:type="simple" xlink:href="http://bg.com/guitars.xml#D"> <descripton xlink:type="simple" xlink:href=" http://newInstance.com/guitar/bgD150/pics/bougd150_con_rim2.jpg" xlink:actuate="onLoad" xlink:show="embed"> Here's the holy grail in process. Dana Bourgeois is building this Brazilian rosewood and adirondack bluegrass monster right now. You'll know it's finished when you hear a run and your windows shatter! </description> </guitar> </guitars>
|
除了这种用简化的链接进行比较简单的列示之外,您还可以指向其它元素的
相关元素。举例来说,在
清单 4
中,我将
description
元素改成指向 bourgeois.xml
文件中指定的图像。
在“清单 4”中,可以看到第一步是在被引用文档中找到特定元素。那个元素用作附加到它之上的相关表达式的引用点。在本例中,指定了那个元素的子孙(由
descendant
关键字指定),在我们的示例中名为 "picture" 的那个元素。然后,该链接的最终目标是那个元素名为 "url" 的属性的值。我知道,这样说太费口舌,但如果循序渐进地做,就会相当简单。
您应该注意到,我在
清单 4
中
没有使用上一节所谈论的 ID 链接的简写形式。那是因为使用那种
ID 链接形式只允许直接链接;不使用 ID
链接的较长形式,就无法进行任何进一步的链接(例如“清单
4”中的子代遍历引用)。
有关 XPointer 提供的多种不同选项的更多信息,请查看联机的
XPointer 规范(请参阅
参考资料)。有关那个看起来很奇怪的链接语法的完整表述,可以查看
XPath;也可以联机查看 XPath 规范(请参阅
参考资料)。
我知道,这只是一篇介绍,但现在,您可以告诉您的朋友和家人:关于
XPointer、XLink 和
XPath,您比他们多了解多少!试用它、阅读规范,并关注即将出现的对这些与
XML 有关的规范的浏览器支持。
参考资料
关于作者
|
|
|
Brett
McLaughlin(
brett@newinstance.com)是
Lutris Technologies 的 Enhydra
策略顾问,专长于分布式系统体系结构方面。他是
Java and
XML(O'Reilly)的作者。他参与了如 Java Servlet、Enterprise
JavaBean 技术、XML 和商家对商家应用程序等技术的研究。他与 Jason
Hunter 一起发起了 JDOM 项目,该项目为从 Java 应用程序中操纵 XML
提供了一个简单的 API。他还是 Apache Cocoon 项目和 EJBoss EJB
服务器的活跃开发人员以及 Apache Turbine 项目的共同创始人之一。
|