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