Vincent.Chan‘s Blog

常用链接

统计

积分与排名

网站

最新评论

技巧:使用 XML 和 XPointer::链接到文档的特定部分

级别: 初级

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 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 项目的共同创始人之一。

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


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


网站导航: