級別: 初級
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:> <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:> <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 項目的共同創始人之一。
|