Josh的学习园地

本站首页    管理页面    写新日志    退出

首页(66) RSS(1) XML初学进阶(47) 


其实我是愿意学习的...
 
 ♀最新日志                                  ♀最新回复                                  
教你认识动态链接库DLL文件
cookie
网络小馅饼 Cookie
开始学习C#
考生了解公务员面试要把握“五个一”
语义Web的基础理论和关键技术研究
today
2006年的学习计划
语义Web和语义网格概述
专业学习
回复:RSS入门 : RSS初步接触
回复:XML(38)合并
回复:语义Web和语义网格概述
回复:全球电子商务的发展趋势及对我们的启
回复:语义Web的基础理论和关键技术研究
«Mar.2026»
1234567
891011121314
15161718192021
22232425262728
293031
 
 

[XML初学进阶]XML(44)合并(链接)
网上资源

7.1 XML链接与HTML链接    进行完对于XML的一系列基本介绍之后,让我们来探索一些XML更深层次的技术。完成了后面三章的学习,相信您将跃升为一个XML开发高手。这一章我们首先从XML链接说起。 说起HTML,大家可能都会对它所提供的超链接功能拍手称快。的确,超链接可以说是鼓起了我们网上冲浪的风帆,它打破了传统的直线形和树形的信息组织结构,根据发散思维的特点,帮助我们利用网状的信息组织,方便地浏览我们感兴趣的内容。 了解HTML的读者都知道,在HTML中表示链接的标记是<A>,通过标记<A>,可以从一个文件链接到另一个文件,或者链接到文件的某一部分。另外,使用标记<IMG>等可以将图象直接嵌入网页。下面就是一个典型的HTML链接的例子: <A href = "http://www.xlinksample.com/students.xml"> List of Students</A> HTML链接尽管定义简单,使用方便,但它也存在着明显的局限性。首先,HTML链接是单向的,它只能从链接所在的文件指向另一个文件。也就是说,我们可以通过标记<A>的href属性知道该文件的若干链接目标,但无法知道又有哪些文件链接到该文件,不知道它有哪些链接源。其次,HTML链接只能指向一个文件,在需要指定多个链接的时候,不得不使用多个<A>标记,而由于HTML是非结构化的,这些链接的关系和结构信息无法表现。第三,HTML可以链接到文件内部的某一部分,这通过在目标文件中插入命名锚(named anchor)来实现。但是,如果源文件和目标文件由不同的人员负责,甚至在不同的站点上,两个文件的协作就成为问题。 XML链接在HTML链接的功能之上又加以扩展,可以支持更为复杂的链接。通过XML链接,不仅可以在XML文件之间建立链接,而且可以建立其他类型数据之间的链接。不仅如此,XML链接还为文件内部定位提供了全新的方式,允许链接的建立者利用文件结构指定文件内部的资源片断。利用简单XML链接,可以轻松地实现HTML中的链接功能;利用扩展XML链接,可以在多个资源之间建立链接,还可以建立多向的链接;利用XPointer在一个XML文件内部的定位功能,可以利用目标文件的结构指定所链接的资源,而无需对目标文件进行任何修改;利用链接库,可以将链接从文件中分离出来,就象用XSL文件把样式转换信息从XML文件中独立出来一样,从而简化链接的管理。 XML链接规范分为三个部分:XLink语言、XPointer语言和XML Base,我们将分三节分别进行讲述。关于Xlink的讨论基于XLink语言规范2000年7月3日候选标准;有关XPointer的讨论基于XPointer语言规范2000年6月7日候选标准;有关XBase的讨论基于XBase规范2000年6月7日工作草案。当前这几个规范都不是正式标准,因此并不稳定,某些内容会随着规范的发展而变化,建议大家在具体开发时参考一下W3C公布的最新版本,XLink、XPointer和XBase规范的最新版本分别可在http://www.w3.org/TR/xlink、http://www.w3.org/TR/xptr、http://www.w3.org/TR/xmlbase处取得。 在详细介绍XML链接之前,我们先来看一个XML链接的例子: <LINK xmlns:xlink = "http://www.w3.org/1999/xlink"      xlink:type = "simple"      xlink:href = "http://www.xlinksample.com/students.xml"      xlink:role = "studentlist"       xlink:title = "Student List"      xlink:show = "replace"      xlink:actuate = "onRequest">List of Students</LINK> 与HTML的链接元素相比较,上面这个例子中的XML链接元素存在以下几点不同: 标记名不同。上例中用的是LINK,而不是HTML中的A。事实上,XML中没有专门用于链接的标记,任意标记名的元素都可以是XML的链接元素,因此例子中的标记名LINK,完全可以换成其他的名字,而不象在HTML中那样一定要用标记<A>。 使用了命名空间。上例中的第一个属性为命名空间声明,且其他属性名都有命名空间前缀。虽然可以使用自己喜欢的任何前缀代表XLink命名空间,但直接使用xlink前缀可以增加文件的可读性,因而我们更推荐这种做法。xlink前缀可以在文件的根元素中定义,也可以在使用xlink前缀的元素中定义。 增加了许多与链接相关的属性。例子中除了第一个属性是命名空间声明和第三个属性与HTML相似以外,其他的属性都是新增加的。由XLink给出的全局属性一共有十个,包括type、href、role、arcrole、title、show、actuate、label、from和to。其中属性type表明了XLink元素的类型,共有六种Xlink元素,即:simple、extended、locator、arc、resource和title,但只有simple、extended 两种XLink元素才是真正的XML链接元素,而其他只用于提供各种描述链接的特性信息。处理程序正是根据type的值决定如何处理该XLink元素。需要强调的是,如果XML文件具有文件类型定义DTD,XLink的全局属性必须在DTD中定义。不过,并不是所有的XLink全局属性都必须在DTD中加以声明,可以根据需要进行裁剪,只声明使用到的属性即可。而且,将一个元素声明为链接元素并没有增加对元素的属性和内容的限制,只要元素实例符合DTD声明,仍然可以包括任意属性和内容。上例的DTD声明如下,其中属性ALT和ALIGN都与链接本身无关: <!ELEMENT LINK (#PCDATA)><!ATTLIST LINK  xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"  xlink:type (simple) #FIXED "simple"  xlink:href CDATA #REQUIRED  xlink:role CDATA #IMPLIED  xlink:title CDATA #IMPLIED  xlink:show (embed | replace | new) "replace"  xlink:actuate (onLoad | onRequest) "onRequest"  ALT CDATA #IMPLIED  ALIGN CDATA #IMPLIED> 当前的主流浏览器Netscape和Internet Explorer对XLink的支持非常弱,在Netscape 6.0的预览发行版中可以发现对简单XML链接的支持,但是其支持的部分并不完全符合最新的规范;IE5.5没有提出对XLink的支持。另外,虽然现在有许多关于XLink的研究计划,但能够完整支持XLink的工具和应用还没有出现。 7.2.1 简单XML Link          简单XML链接与HTML链接非常相似,它在两个资源之间建立关联。这两个资源分别是文件中的链接元素和XLink全局属性href所指向的资源,其中链接元素为本地资源或起始资源,href所指向的资源为远程资源或目标资源。可以用简单XML链接实现HTML链接,下面示例中使用XLink实现HTML中的链接标记<A>。 <!ELEMENT A(#PCDATA)><!ATTLIST A   xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"     xlink:type (simple) #FIXED "simple"    xlink:href CDATA #REQUIRED    xlink:role CDATA #IMPLIED    xlink:title CDATA #IMPLIED    xlink:show (embed | replace | new) "replace"    xlink:actuate (onLoad | onRequest) "onRequest"> 可以利用上面的DTD声明,我们可以定义元素A的实例: <A xlink:href = "http://www.xlinksample.com/simplelink.xml">This is a simple xlink!</A> 对照HTML中的链接的例子: <A href = "http://www.xlinksample.com/simplelink.xml">This is a simple xlink!</A> 可以发现,两种写法已经非常接近,除了XML中具有xlink前缀表示XLink命名空间,其他都完全一样(这里我们假设命名空间已经在文件首部声明)。同样,它们在浏览器上的表现也应该是一样的。在上例中所链接的资源是元素A和"http://www.xlinksample.com/simplelink.xml"所指向的资源,下面是它的示意图。 500)this.width=500'> 同样,我们可以使用XLink实现HTML中的<IMG>标记: <!ELEMENT IMG EMPTY><!ATTLIST IMG   xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"  xlink:type (simple) #FIXED "simple"  xlink:href CDATA #REQUIRED  xlink:show CDATA #FIXED "onLoad"  xlink:actuate CDATA #FIXED "embed"  ALT CDATA #IMPLIED  ALIGN CDATA #IMPLIED  HEIGHT CDATA #IMPLIED  WIDTH CDATA #IMPLIED  BORDER CDATA #IMPLIED> 当然,HTML中<IMG>标记的属性比上面列出的多一些,但是如果忽略那些不常使用的属性,使用上面的DTD声明定义实例,就可以在XML文件中嵌入图象资源。 <IMG xlink:ref = "imgEmbed.gif" /> 下面,我们就来分别介绍一下简单链接中所使用到的属性。 类型属性 类型(xlink:type)属性决定了链接或资源的类型,XLink处理程序根据xlink:type的值决定如何处理链接元素,但是处理程序的动作并不仅仅取决于这一个属性,它还将取决于下面将要提到的行为属性。对XLink而言,xlink:type属性可以在元素的开始标记中定义,也可以在DTD中定义缺省值,但必须使XML分析器分析到链接元素时能够得到属性xlink:type的值。xlink:type属性的取值可以是simple、extended、locator、arc、resource、title和none其中之一。 对简单XML链接,type属性固定取值为"simple",前面定义的A标记和IMG标记都是简单XML链接的例子。 如果一个元素的xlink:type属性取值为none,那么该元素就不是一个链接元素,不具有链接意义。如果该元素还具有一些与链接相关的其他属性或子元素,这些属性和内容也将失去其链接意义。例如下例中的NOLINK元素中包括的子元素LINK,虽然指定了xlink:type为simple,但仍然不具有链接意义。 <NOLINK xmlns:xlink = "http://www.w3.org/1999/xlink"               xlink:type="none">  <LINK xlink:type = "simple"         xlink:href = "http://www.xlinksample.com/students.xml"        xlink:role = "studentlist"         xlink:title = "Student List"        xlink:show = "replace"         xlink:actuate = "onRequest">  List of Students  </LINK></NOLINK> 一般情况下,可以将简单XML链接元素的DTD定义如下: <!ELEMENT LINK (#PCDATA)><!ATTLIST LINK  xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"  xlink:type (simple) #FIXED "simple"  xlink:href CDATA #REQUIRED  ……> 但在某些情况下,元素LINK仅仅在文件某些地方作为链接元素出现,而在其他地方作为普通元素出现。此时,可以将DTD定义为: <!ELEMENT LINK (#PCDATA)><!ATTLIST LINK  xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"  xlink:type (none | simple) #REQUIRED  xlink:href CDATA #REQUIRED  ……> 在利用该DTD创建XML文件时,只要在需要链接元素的地方,将xlink:type属性取值为"simple",在其他地方则取值为"none"。如果需要将链接元素改为非链接元素,只要简单地将xlink:type属性的值由"simple"改为"none"即可,反之亦然。 寻址属性 XML链接元素的寻址属性是指xlink命名空间的href属性,它指定了链接的目标资源。该属性的取值是一个URI,它可以是一个文件或文件中的某一特定位置。XML链接的xlink:href属性与HTML链接的href属性基本相同,如: <LINK xmlns:xlink = "http://www.w3.org/1999/xlink"      xlink:type = "simple"      xlink:href = "http://www.xlinksample.com/students.xml"></LINK><LINK xmlns:xlink = "http://www.w3.org/1999/xlink"      xlink:type = "simple"      xlink:href = "students.xml"></LINK><LINK xmlns:xlink = "http://www.w3.org/1999/xlink"      xlink:type = "simple"      xlink:href = "http://www.xlinksample.com/students.xml#zhang"></LINK> 在上面的三个例子中,第一个例子指定了目标资源的绝对位置,第二个例子指定了目标资源的相对位置,第三个例子指定了被链接文件中的某个具有ID属性,且取值为"zhang"的元素。对于第二种情况,XLink处理程序必须能够接收xml:base属性,指定资源相对于哪个位置,然后将xml:base与xlink:href合并得到资源的具体位置。而对于第三种情况中的文件内部定位,则由Xpointer语言定义。关于XPointer和XML Base的详细介绍,请参照本章中的XPointer和XML Base小节。 另外,简单XML链接的xlink:href属性可以不出现。此时这种链接薹ㄏ笃胀ǖ牧唇右谎せ睿匀豢梢越衅渌恚缈梢岳盟试春褪粜酝ü齒Link属性关联起来。这种用法并不常见,此时需要改写前面的DTD声明。 <!ELEMENT LINK (#PCDATA)><!ATTLIST LINK  xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"  xlink:type (none | simple) #IMPLIED  xlink:href CDATA #IMPLIED  ……> 语义属性 由于属性xlink:arcrole、xlink:role和xlink:title用于描述链接或资源,因此常称它们为语义属性。其中xlink:role属性用于机器阅读,如用于搜索引擎的“爬行”(crawler或spider)程序,而xlink:title属性则用于人工阅读。在简单 XML链接中,xlink:role和xlink:tile用于描述链接所指向的资源,在下面例子中,表示目标文件(由"http://www.xlinksample.com/students.xml"指定)具有role为"studentlist",title为"Student List"。 <LINK xmlns:xlink = "http://www.w3.org/1999/xlink"      xlink:type = "simple"      xlink:href = "http://www.xlinksample.com/students.xml"      xlink:role="studentlist"       xlink:title="Student List"      xlink:show="replace"       xlink:actuate="onRequest">List of Students</LINK> 属性xlink:role和xlink:title是可选的。象其他属性一样,它们可以直接用于XML文件,也可以在DTD中定义,如: <!ELEMENT LINK (#PCDATA)><!ATTLIST LINK  ……  xlink:role CDATA #IMPLIED  xlink:title CDATA #IMPLIED> 至于属性xlink:arcrole,它只能用于arc类型元素中,其作用与role类似,我们将在链接弧一节中对它作进一步介绍。 行为属性 链接元素还包括两个全局属性xlink:show和xlink:actuate,用于指示在链接激活时的行为,因此称为行为属性。属性xlink:show表示链接激活时,目标资源的显示环境,如在当前窗口显示或在新的窗口中显示;而xlink:actuate表示何时激活链接,是文件加载时或用户要求时。 xlink:show属性的取值必须为new、replace、embed、other和none五个值之一。下表描述了show属性各个取值的意义,并给出了对应的HTML代码。 取  值 含  义 HTML代码 new 在链接激活时,被链接资源将显示在新窗口。 <A href = "..." target = "_blank">...</A> replace 在链接激活时,被链接资源将显示在起始资源所在的窗口中。 <A href ="..." target = "_self">...</A> embed 链接激活时,被链接资源直接嵌入链接所在文件。 <IMG src ="..."> other 链接激活时,其显示方式由该链接中的其他置标决定。 无 none 链接激活时,其显示方式无法由该链接决定。 无 从表中可以看出,当属性xlink:show取值"embed"时,目标资源将直接嵌入源文件,因此起始资源常常不是完整的文件。利用目标资源的内嵌可以实现客户端的文件包含。例如:用XLink链接几个相关文件,构成一个完整的XML文件。但是,正如HTML中的IMG元素一样,目标资源的嵌入仅仅影响相关资源的显示,并不表示起始资源的转换。例如,如果目标资源是XML文件,该文件并不会作为起始资源的一个部分而被XML分析器所处理。 属性xlink:actuate表示链接的激活时间,它有四个预定义值onRequest、onLoad、other和none,actuate属性的取值必须位居其一。下面仍然以列表的形式给出各个属性的含义: 取   值 含   义 onRequest 在文件装入后,链接在用户要求的时候激活,通常是一个用户动作或指示,比如用户在浏览器上用鼠标点击了链接,或者应用程序发出了命令等。 onLoad 在文件装入时直接激活链接。一般而言,对xlink:show属性取值为"embed"时,将xlink:actuate取值"onLoad"是很自然的选择,尤其是起始资源不完整的时候。 other 链接激活的时机由链接的其他置标决定。 none 链接激活的时机无法由链接自身决定。 xlink:show属性和xlink:actuate属性都是可选的,它们可以直接使用,也可以在DTD声明中定义: <!ELEMENT LINK (#PCDATA)><!ATTLIST LINK    ……    xlink:show (new | replace | embed | other | none ) #IMPLIED "replace"  xlink:actuate (onLoad | onRequest | other | none) #IMPLIED "onRequest"> 7.2.2.1 基本构成     通过前面一节对简单XML链接的介绍,可以发现,无论是对构造链接的文件作者,还是对处理链接的应用来说,简单XML链接都与HTML中的链接十分类似。然而与HTML链接一样,简单XML链接的功能是比较有限的。为了满足复杂的需要,XML链接规范定义了扩展XML链接。通过扩展XML链接,可以在多个资源间实现多向的XML链接。 扩展XML链接元素的构造,很大程度上取决于用户,但通常都会包括一个资源集合和一个连接集合。资源集合中可以包括本地资源和远程资源,如果资源是XML链接元素的组成部分,该资源是本地资源;否则就是远程资源,如另外的XML文件或本文件的其他元素。连接集合中的各个元素表示资源集合元素间的链接。除了资源集合和连接集合外,扩展XML链接元素可以包括其他内容或标记,甚至可以包含简单XML链接或扩展XML链接作为其子元素。 扩展XML链接的xlink:type属性值固定为"extended"。它还可以具有语义属性,即前面讲到的xlink:role和xlink:title属性,其意义与前面所说的相似,只不过是用于描述整个链接。扩展XML链接包括的资源数目可以少于两个,甚至可以不包含资源。 下例是一个扩展XML链接的DTD声明,其中EXTLINK元素是一个扩展XML链接元素,它包含零到多个RESOURCE元素、LOCATOR元素和CONNECTION元素。其中RESOURCE元素表示本地资源,LOCATOR元素表示远程资源,CONNECTION元素表示这些资源间的连接。从这个声明中,我们可以对扩展链接的结构更为明了。 <!ELEMENT EXTLINK (RESOURCE | LOCATOR | CONNECTION)*><!ATTLIST EXTLINK  xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"  xlink:type (extended) #FIXED "extended"  xlink:role CDATA #IMPLIED  xlink:title CDATA #IMPLIED><!ELEMENT RESOURCE ANY><!ATTLIST RESOURCE  xlink:type (resource) #FIXED "resource"  xlink:role CDATA #IMPLIED  xlink:title CDATA #IMPLIED  xlink:label NMTOKEN #IMPLIED><!ELEMENT LOCATOR ANY><!ATTLIST LOCATOR  xlink:type (locator) #FIXED "locator"  xlink:href CDATA #REQUIRED  xlink:role CDATA #IMPLIED  xlink:title CDATA #IMPLIED  xlink:label NMTOKEN #IMPLIED><!ELEMENT CONNECTION (#PCDATA)><!ATTLIST CONNECTION  xlink:type (arc) #FIXED "arc"  xlink:from CDATA #REQUIRED  xlink:to CDATA #REQUIRED  xlink:arcrole CDATA #IMPLIED  xlink:title CDATA #IMPLIED  xlink:show (embed | replace | new | other | none) "replace"  xlink:actuate (onLoad | onRequest | other | none) "onRequest"> 一般而言,扩展链接元素与其关联的资源是分离的。通过扩展链接,可以在只读资源间建立链接。有时虽然资源自身不是只读的,但是修改资源本身非常困难,而修改链接元素相对容易,或者有时资源内部无法插入链接,例如一段视频,这时都可以使用扩展链接在这些资源之间建立链接。 7.2.2.2 本地资源     扩展XML链接使用特定的子元素指定本地资源,这个子元素称为本地资源元素。本地资源元素是一个将xlink:type的值取为"resource"的链接元素,而且必须作为扩展XML链接元素的直接子元素出现。 本地资源元素可以包含语义属性xlink:role和xlink:title,它用于描述该资源。同样本地资源元素的语义属性也是可选的。 另外,本地资源元素还可以包含xlink:label属性以标记该资源,该标记的值用于连接元素。xlink:label属性值可以重复,即多个资源可以具有相同的xlink:label属性值。 本地资源元素在链接属性之外,还可以包含其他的属性和内容,不过这些内容本身不具有链接意义。同样,本地资源元素也可以不包含任何内容,如果这类本地资源元素作为链接的起始资源,链接的显示将取决于处理程序。例如,由于属性xlink:title提供了该资源的描述信息,因此交互式处理程序可能会显示该属性的内容。 下例定义了一个本地资源元素: <RESOURCE xlink:role = "student" xlink:title = "学生张三" xlink:label = "student">张三</RESOURCE> 这个例子中没有列出<RESOURCE>元素所在的上下文,其实它不应该单独存在,而应该作为一个扩展XML元素的子元素出现。 7.2.2.3 远程资源       扩展XML链接的远程资源也是通过特定的子元素来描述的,该子元素称为远程资源元素。远程资源元素的xlink:type属性的取值为"locator",同样,远程资源元素也必须是扩展XML链接元素的直接子元素,否则也不具有链接意义。 远程资源元素具有寻址属性xlink:href和语义属性xlink:role、xlink:title。寻址属性xlink:href表示远程资源的URI,与简单XML链接中的href属性一样,它可以是一个绝对URI、相对URI或资源内部的一个具体位置。对于远程资源元素,xlink:href是必须的,通过它才能定位远程资源。语义属性xlink:role、xlink:title用于表示资源的描述信息。与本地资源元素一样,远程资源元素也可以包含xlink:label元素,其含义和要求与本地资源元素相同。 虽然包含寻址属性xlink:href,一个远程资源元素自身并不构成链接。在简单XML链接和HTML链接中,xlink:href属性表示链接元素和href指定的目标资源间之间的一个链接。但在远程资源元素中,它仅仅表示一个资源而已。也许用有向图更有助于理解上面的概念。如果将扩展XML链接表示成有向图,那么图的结点集合就是资源集合(本地资源和远程资源),而连接集合就构成图的边集合。一个远程资源元素仅仅是图的一个结点而已。 远程资源元素可以具有任何内容,一般而言,远程资源元素的内容不具有链接意义。 用xlink:type="resource"表示本地资源、用xlink:type="locator"表示远程资源有时容易令人混淆,因此《XML Bible》一书的作者Elliotte Rusty Harold建议使用xlink:type="locate"表示本地资源,而用xlink:type="remote"表示远程资源,但是在W3C规范没有采用这个建议以前,使用当前的表示法仍然是唯一的选择。 下面给出一个远程资源的例子,与前面本地资源类似,这个远程资源元素也应该作为一个扩展XML元素的子元素出现。 <LOCATOR xlink:href = "http:// www.xlinksample.com/teacher.xml"         xlink:role = "teacher"         xlink:title = "老师:张三"         xlink:label = "teacher">张三</LOCATOR> 7.2.2.4 链接弧     链接弧(arc)用于表示扩展XML链接中资源之间的连接关系,它是扩展XML链接元素的子元素,xlink:type属性值为"arc",称之为链接弧元素。在用有向图描述扩展XML链接时,链接弧是连接资源的有向边,不过后面我们将要讲到,一个链接弧元素未必只表示一条有向边。在有向图中,随着结点个数的增加,其边的数目将指数级增加。因此在扩展XML链接中,随着资源的增加,连接的数量也会指数级增加。例如:如果一个扩展XML连接的资源由3个增加到4个,可能的连接数目将从9个上升到16个。 如果一个链接弧的起始资源在本地,而目标资源是远程的,那么这个链接弧称为出站(outbound)链接弧;反之,如果起始资源是远程的,而目标资源在本地,则称为入站(inbound)链接弧;如果起始资源和目标资源都不在本地,则称为第三方(third-party)链接弧。虽然没有作明确规定,但一般而言,一个链接一般只包含一类链接弧,因此可称为出站链接、入站链接或第三方链接。对HTML链接和简单XML链接而言,由于链接总是从链接元素到href代表的远程资源,因此都属于出站链接。扩展XML链接可以包括三种链接中的任意一种。 链接弧元素本身必须作为扩展XML链接元素的直接子元素,否则该元素将失去其链接意义。元素中可以包含任何内容,在一般情况下,这些内容不具有链接意义。链接弧元素中的属性可以有遍历属性(xlink:from和xlink:to)、行为属性(xlink:show和xlink:actuate)和语义属性(xlink:arcrole和xlink:title)。 xlink:from和xlink:to属性用于描述资源之间的连接,资源元素的标识通过其xlink:label属性识别。xlink:from定义了链接弧的起始资源,在有向图中是边的起点,xlink:to定义了链接弧的目标资源,在有向图中是边的终点。遍历属性的取值必须是资源元素(包括本地资源元素和远程资源元素)的xlink:label属性已经定义的值。总之,链接弧表示从xlink:from所代表的资源元素到xlink:to代表的资源元素之间的连接。由于xlink:from、xlink:to和xlink:label属性用于链接的遍历,因此这三个属性常被称为遍历属性(traversal attributes)。 如果xlink:from和xlink:to的值对资源元素是唯一的,即只有一个资源元素的xlink:label属性具有xlink:from或xlink:to指定的值,那么这个链接弧只包括一个连接,在有向图中表现为一条边。如果xlink:from和xlink:to的值对资源元素不唯一,即有多个资源元素的xlink:label属性具有xlink:from或xlink:to属性值,那么这个链接弧则表示多个连接,在有向图中表现为多条边。例如,下面例子中,扩展XML链接元素EXTLINK包含一个本地资源RESOURCE元素、三个远程资源LOCATOR元素和两个CONNECTION元素,它表示课程、教师和学生的关系。RESOURCE和LOCATOR元素的xlink:label属性依次定义为"DataStructure"、"teacher"和"student",CONNECTION元素的xlink:from和xlink:to的值必须为上述三个值之一。 <EXTLINK>  <RESOURCE xlink:role = "course" xlink:title = "计算机系课程:数据结构" xlink:label = "DataStructure">  数据结构  </RESOURCE>  <LOCATOR xlink:href = "http:// www.xlinksample.com/teacher.xml" xlink:role = "teacher" xlink:title = "老师:张三" xlink:label = "teacher">     张三  </LOCATOR>  <LOCATOR xlink:href = "http:// www.xlinksample.com/StudentLi.xml" xlink:role = "student" xlink:title = "学生:李四" xlink:label = "student">  李四  </LOCATOR>  <LOCATOR xlink:href = "http:// www.xlinksample.com/StudentWang.xml" xlink:role = "student" xlink:title = "学生:王五" xlink:label = "student">    王五  </LOCATOR>  <CONNECTION xlink:from = " teacher" xlink:to = " DataStructure" xlink:arcrole = "course" xlink:title = "老师教授课程">  课程的授课老师安排  </CONNECTION>  <CONNECTION xlink:from = " teacher" xlink:to = "student" xlink:arcrole = "teach" xlink:title = "老师教授学生">  学生的授课老师安排  </CONNECTION></EXTLINK> 用有向图来表示上面的例子,可以看到第一个CONNECTION元素表示了一条有向边,而第二个CONNECTION元素表示了两条有向边,见下图。 500)this.width=500'> xlink:from和xlink:to属性可以省略,这时表示该扩展XML链接元素包含的所有资源元素均参与到链接中。如果省略了xlink:from属性,那么该链接弧表示从所有资源元素到xlink:to代表的资源元素的连接;类似地,如果省略了xlink:to属性,则表示从xlink:from代表的资源元素到该扩展XML链接元素的所有资源元素的连接。如果xlink:from和xlink:to两个属性同时省去,则表示所有链接元素构成的全连接,其中包括了从每个链接元素到自身的链接。 链接弧元素的行为属性xlink:show和xlink:actuate的含义及取值与简单XML链接中的相应属性一样。语义属性xlink:arcrole和xlink:title则是用于描述相对于链接弧的起始资源而言,目标资源所具有的性质,我们可以将xlink:arcrole 理解为自然语言中的谓语,而链接弧起始资源是自然语言中的主语,目标资源是自然语言中的宾语,这样一个链接弧就可以对应于自然语言中的语句。对于同一个资源而言,它对不同的起始资源有不同的性质,因此一个资源在不同的链接弧中可以定义不同的语义属性。 最后需要注意的是:链接弧不能重复定义。也就是说,在同一个扩展XML链接中,不能定义多个链接弧元素,它们的xlink:from的值和xlink:to的取值都相同。 7.2.2.5 Title类型元素     从前面三小节可以看出,无论是资源元素(本地资源和远程资源),还是链接弧元素,都提供了语义属性xlink:title,它使用可供人阅读的语言来描述相应的元素。但是,这种描述方式也存在它的局限性:首先,每个元素只能有一个xlink:title属性,在需要对一个资源进行多种描述的场合,它就无能为力。另外,xlink:title作为属性存在,不具有内部结构。对于一些希望用结构描述的资源,该属性也无法提供一个满意的办法。 为了解决上面提到的问题,XLink提供了一种称为title类型元素的特殊元素,它的xlink:type属性取值为"title",title类型元素可以包含任意内容、属性,也可以包含子元素,因此可以实现资源多描述和内部结构。需要注意的是,title类型元素必须作为本地资源元素、远程资源元素或链接弧元素的直接子元素才具有链接意义。 下面是title类型元素的一个可能的DTD声明及实例。 <!ELEMENT DESCRIPTION (NAME)><!ATTLIST DESCRIPTION  xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"  xlink:type (title) #FIXED "title"  ……><DESCRIPTION>  <NAME>……</NAME></DESCRIPTION> 至此,我们已经介绍完所有可能的链接元素类型。下面,我们根据这些类型对XLink属性的组合加以列表:   simple extended resource locator arc title type 必须 必须 必须 必须 必须 必须 href 可选 无 无 必须 无 无 title 可选 可选 可选 可选 可选 无 role 可选 可选 可选 可选 无 无 arcrole 无 无 无 无 可选 无 show 可选 无 无 无 可选 无 actuate 可选 无 无 无 可选 无 label 无 无 可选 可选 无 无 from 无 无 无 无 可选 无 to 无 无 无 无 可选 无        7.2.2.6 链接库       一个包含入站链接弧或第三方链接弧集合的文件称为链接数据库(link database)或链接库(linkbase),链接库必须是一个XML文件,它使得链接管理相对容易。对链接库的最好对比可能是XSL,XSL将XML的数据内容与表现方式分离开来,而链接库则将资源与链接分离开来,可以对它们分别进行编辑和修改。通过链接库文件,可以为一个只读文件增加一个链接。 象XSL一样,必须有一个机制为起始的远程资源指明它相关的链接库文件,从而将XML文件和链接库文件结合起来。在理想情况下,该方法应该是外在的。此时,可以象刚才介绍的那样使用链接库文件对只读文件建立链接。如果没有外在的方法,XLink提供了一个方法可以指定潜在的相关链接库,这就是链接库的定位。 XLink中链接库的定位是通过特殊的链接弧实现的,其特殊性在于该链接弧的xlink:arcrole属性值为http://www.w3.org/1999/xlink/properties/linkbase,该链接弧称为链接库弧。对于链接库弧的处理与普通链接弧的处理类似,但是其xlink:show属性值将被忽略,因为链接库弧本身不作为链接表现。 用于定位链接库的链接元素的一个可能DTD声明如下: <!ELEMENT LINKBASE-LOCATING (LOCATOR| CONNECTION)><!ATTLIST LINKBASE-LOCATING  xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"  xlink:type (extended) #FIXED "extended"  xlink:role CDATA #IMPLIED  xlink:title CDATA #IMPLIED><!ELEMENT LOCATOR EMPTY><!ATTLIST LOCATOR  xlink:type CDATA #FIXED "locator"  xlink:href CDATA #REQUIRED  xlink:role CDATA #IMPLIED  xlink:title CDATA #IMPLIED  xlink:label NMTOKEN #IMPLIED><!ELEMENT CONNECTION EMPTY><!ATTLIST CONNECTION  xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"  xlink:type (arc) #FIXED "arc"  xlink:from NMTOKEN #IMPLIED  xlink:to NMTOKEN #IMPLIED  xlink:actuate (onLoad | onRequest) #IMPLIED  xlink:title CDATA #IMPLIED  xlink:arcrole CDATA #FIXED "http://www.w3.org/1999/xlink/properties/linkbase"> 根据这个DTD,可以定义链接库实例如下: <LINKBASE-LOCATING>  <LOCATOR xlink:href = "http://www.linkbase.com/spec.xml"           xlink:label = "spec" />  <LOCATOR xlink:href = "http://www.linkbase.com/linkbase.xml"           xlink:label = "label"/>  <CONNECTION xlink:from = "spec"              xlink:to = "label"              xlink:actuate = "onLoad"/></LINKBASE-LOCATING> 通过将链接库弧的起始资源指向另一个链接库弧,可以形成一个链接库链。链的长度可以由初始的链接弧限定。 7.3.1 XPointer概述     通过前面的介绍可以看到,XLink中xlink:href属性的取值可以是一个文件,也可以引用文件内的某个特定位置。引用文件可使用URL,引用文件的特定部分则要使用XPointer,通常将它加到URL的结尾,更明确地表示目标资源。 我们知道,HTML中也支持文件内部定位,而且定位方法非常简单,就是在目标文件中插入一个命名锚,然后用链接元素<A>的href属性指定链接的位置即可。下面的例子是在一个文件内部建立链接,类似地,链接也可以建立在不同文件内部。 ……<A name = "_loc1">Location 1</A>…… <A href = "#_loc1">Jump to Location 1</A>…… 但是,这种机制也存在着一些问题。首先,因为需要在开始文件和目标文件中明确定位,因而必须同时控制这两个文件。如果这两个文件由不同的人控制,或者在不同的站点上,可能会出现其中一个文件发生了修改,但没有及时通知另一个文件的情况,这时很容易出现错误的链接或者链接失效。即使能够同时控制目标文件和开始文件,也不是没有可能只修改了其中一个,但忽略了另一个。因此,命名锚的机制增加了网页维护的负担和出错的机率,只有在目标文件和开始文件是同一个文件时才相对有效一些。另外,链接库提供了资源和链接分离的机制,使文件和链接更易于管理,插入命名锚显然违背了这一原则,目标文件中仅仅为链接而建立的命名锚并没有增加资源的内涵,反而降低了文件的可读性。 由于XML是结构化的文件,这使得借助文件结构进行内部定位成为可能,此时无须对文件本身进行修改,这就是XPointer。XPointer用于在资源内定位片断(fragement),它支持在XML文件中定位元素、属性、字符串等内部结构,例如,我们可以定位到根元素或者当前元素的第5个子元素,也可以定位到文件中的某一个点或两个点之间的区域。 XPointer基于XSL转换中的XPath语言,并在其基础上进行了扩展,包括: 可以定位节点、点和区域; 通过字符串匹配定位资源片段; 在URI引用中定位资源片断。 由于XPointer的功能是文件内部定位,因此它可以使用在需要定位的任何地方,例如在可视化的XML编辑器中定位元素、属性等。但人们经常利用XPointer描述XLink链接的目标资源,这也是把XPointer放在本章讨论的原因。 考察下面的文件片断,它表示了从文件的LINK元素到文件"http://www.xlinksample.com/xpointer.xml"中根元素的链接,其中"xpointer(/child::*[position()=1])"就是用于定位的XPointer。 <LINK  xmlns:xlink = "http://www.w3.org/TR/1999/xlink"  xlink:type = "simple"  xlink:href = "http://www.xlinksample.com/xpointer.xml  #xpointer(/child::*[position()=1]"></LINK>   7.3.2 XPointer形式     XPointer有三种形式用于标识片断:完整形式(Full XPointers)、无修饰名称(bare names)或子节点序列(child Sequences)。下面我们来一一讲述: 完整形式 完整形式的XPointer可以包括由一个或多个XPointer部分(XPointer Part),各个部分间可以由空格分开,也可以没有分隔符。每个XPointer部分用"xpointer"打头,其后跟一个表达式,表示根据此表达式进行定位计算。包含多个部分的XPointer是从左至右逐个部分计算,首先计算第一部分,如果第一个XPointer部分运算失败,将运算第二个XPointer部分,直至得到运算结果或处理完所有的部分。 例如下面的第一个例子选取文件中的根元素spec的所有body子元素,第二个例子选取文件中的第2个language元素,第三个例子表示选取文件中id=" _loc"的元素,第四个例子表示首先选取文件中id="_loc"的元素,如果不存在则选取文件中id="_LOC"的元素。 xpointer(/child::spec/child::body)xpointer(descendant::language[position()=2])xpointer(id("_loc "))xpointer(id("_loc ")) xpointer(id("_LOC")) 在利用XPointer进行文件内部定位时,所使用的文件是已经确定的,如何指定文件是由XLink而不是XPointer所决定。例如在下面的例子中,首先指定了文件为"http://www.xlinksample.com/xpointer.xml",然后再在该文件中寻找需要的元素。 <LINK xmlns:xlink = "http://www.w3.org/TR/1999/xlink"      xlink:type = "simple"      xlink:href ="http://www.xlinksample.com/xpointer.xml  #xpointer(/child::*[position()=1]"></LINK> 无修饰名称 在上面的第三个例子中,利用id()进行元素定位,表示文件中ID等于指定常数的元素,因为这种定位方式很常见,XPointer语言提供了一种简写方式,可以将xpointer(id(name))简写成name。例如: http://www.xlinksample.com/xpointer.xml#xpointer(id("_loc")) 可以简写为 http://www.xlinksample.com/xpointer.xml#_loc 可以看出,这种表示法与HTML中完全相同。使用这种简写方式有两个好处:首先,它鼓励人们使用ID属性标识元素,从而在文件结构发生变化时链接不会失效。其次,它提供了与HTML的兼容性。但是,这种写法与HTML有着相同的问题,它仍然要求必须同时控制开始文件和目标文件,因此选取何种形式取决于具体的应用。 子节点序列 子节点序列是由一系列数字和"/"组成的序列,其中"/"用于分隔数字,数字n表示前面定位元素的第n个直接子元素,是"child::*[position()=n]"的简写。子节点序列不考虑元素的名称和类型,在序列前可以是刚才提到的无修饰名称,表示从ID属性为指定名称的元素开始定位,否则数字序列必须以"/1"打头,表示文件的根元素。文件中的其他节点,如属性、注释等,不能用子节点序列定位,由于文件的根节点没有父节点,因此也不能用子节点序列定位。 请注意,文件的根节点和根元素不是同一个概念。根节点是一个包含整个文件的抽象节点,包括XML声明、DTD、处理指令(PI)等,而根元素是文件中最外层的元素,它是根节点的直接子元素。根节点用"/"表示,而根元素用"/1"表示。如果用一棵树表示XML文件,根节点和根元素的关系可以表示如下图,为了清晰起见,图中没有把根节点的其他子节点和根元素的子节点画出。 500)this.width=500'> 下例表示根元素的第4个子元素包含的第5个子元素: #/1/4/5 如果用完整形式表示,应该是: #xpointer(/child::*[position()=1]/child::*[position()=4]/child::*[position()=5]) 下面例子表示id="_loc"元素的第3个子元素内的第2个子元素。 #_loc/3/2 同样可以用完整形式表示为: #xpointer(id("_loc")/child::*[position()=3]/child::*[position()=2])   7.3.3 位置路径和位置集合       在大多数情况下,完整形式中的XPointer表达式是一个位置路径(Location Path),它与XSL转换中的位置路径相同。尽管有许多可能的简写形式,但一般而言,位置路径是由"/"分隔的位置步(Location Step)构成。 位置步在目标文件中指定一个位置,通常是相对于一个已知的位置,如文件的根节点或另外一个位置步等。位置步由一个关键字(axis)、节点测试(node-test)和可选的谓词(prediates)构成,这三个部分我们将在后一小节详细讲述。这里我们首先来看一下其构成形式: axis::node-test[prediates] 例如,下面的位置步中关键字是"descendent",节点测试为"language",谓词是"position()=2"。 descendant::language[position()=2] 多个位置步用"/"相连构成位置路径,在计算定位元素时将从左到右计算,首先计算第一个位置步,得到位置,下一个位置步的计算就相对于这一个位置,依次向下计算。就可以得到最后的结果。例如: /child::spec/child::body[position()=2] 其中第一个"/"表示根节点;"child::spec"是第一个位置步,表示根节点的spec直接子元素,如果文件的根元素是sepc,计算出来的结果应为根元素,否则计算结果为空;"child::body[position()=2]"是第二个位置步,表示上次计算出来元素的第二个body直接子元素。在上面的例子中,如果文件的根元素是spec,而且它包含两个以上的body子元素,返回的结果将是一个元素,否则将不返回结果。位置路径可以照此继续构造下去。 如果将位置路径改为: /child::spec/child::body[position()>2] 如果根元素sepc包含body子元素的数量大于3个,那么返回的结果将至少包含2个元素,从而构成了一个集合,这个集合就称为位置集合;如果返回的结果只包含一个元素,我们称位置集合只包含一个元素;如果不返回任何结果,我们称位置集合是空集。因此位置路径的计算结果是位置集合。与普通集合不同的是,位置集合中的元素是有序的。其具体排序规则由关键字决定。 由于XPointer可以用于XLink中表示资源,而XPointer可能返回多个节点构成的集合。因此XLink必须处理多个节点的情况。XLink规定,如果链接的起始资源含有多个节点,则将每个节点作为一个单独的起始资源,反应在浏览器上就是每个节点都有一个到目标资源的链接。如果链接的结束资源包含多个节点或者不是节点类型(点或区域),则将其作为统一的资源处理。 7.3.4 位置步     位置步用于表示一个相对于已知位置的位置,这个已知位置可能是一个绝对位置,也可能是一个计算结果,由所处的上下文(context)决定,这个位置称为上下文节点(context node)。如前所述,位置步的构成包括三个部分: 关键字,有且仅有一个,用于表示结果节点与上下文节点在文件树中的关系; 节点测试,有且仅有一个,用于表示结果节点的类型或扩展名; 谓词,零到多个,用于限制结果的任意表达式。 位置步首先利用关键字和节点测试计算,得到初始结果集,然后依次利用谓词进行过滤。初始结果集中满足所有谓词的就是返回结果。初始结果集中的元素与上下文节点构成关键字关系,而且具有节点测试指定的类型或名称,例如child::sepc表示上下文节点的所有sepc子元素。在对初始结果集进行过滤时,首先用第一个谓词对初始结果集进行过滤,返回一个结果集,在此基础上利用第二个谓词过滤,依次类推,直到得到最后的结果集。 关键字 前面的例子提到了几个关键字child、descendent,其他的关键字还有ancestor、self、ancestor-or-self、paren、descendant-or-self、attribute、following、preceding、following-sibling、preceding-sibling等,它们的含义与XPath中的对应关键字一样,请读者参考4.3.3节,这里不再赘述。这些关键字的返回结果总是节点或节点构成的集合,节点的类型可以是元素、属性、注释、文本、处理指令等,但不能是命名空间。 由于位置步总是计算相对于上下文节点的位置,因此需要一个绝对位置,表示第一个位置步的上下文节点。关键字的运算取决于上下文节点,如果上下文节点有多个,它将对上下文节点逐一进行计算。XPointer可以利用XPath的绝对位置定位方法进行定位,包括利用"/"表示根节点和用id()表示具有给定ID值的元素。 关键字具有自己的基本节点类型,基本节点类型主要用于节点测试。对于那些可以包含元素的关键字,如child、parent等,其基本节点类型为元素类型,在上面提到的12个关键字中,除了attribute以外,其他关键字的基本节点类型都是元素类型。而关键字attribute关键字的基本节点类型是属性类型。 节点测试 节点测试用于测试节点类型或节点名称,只有那些满足节点测试的节点才会保留在初始的结果集中,以待下一步的谓词过滤。 在很多情况下,节点测试是一个名称,此时要求候选节点的类型与关键字的基本节点类型相同,并且具有指定的名称。因此对除attribute以外的关键字,如果节点测试是一个名称,结果将返回一个具有指定名称的元素集合,而对attribute关键字,同样的节点测试将返回具有指定名称的属性。例如:child::sepc返回上下文节点内的所有名为sepc的子节点,如果上下文节点没有名为sepc的子节点,结果将返回空集;而attribute::href将返回上下文节点的href属性,类似地,如果上下文节点不包括href属性,结果也会返回空集。 其他的节点测试还有: *; node(); comment(); processing-instruction(); text(); 通配符*表示所有的元素,它不考虑元素的名称,只要元素与上下文节点满足关键字所指定的关系即可,例如child::*表示上下文节点的所有子节点。通配符*只选择元素类型。如果你希望选择所有节点,可以用node()表示。通配符*还可用于名称内部,用于过滤特定命名空间的元素和属性。比如: child::*:specattribute::xlink:* 上面的第一个例子表示上下文节点内所有命名空间下名为spec的所有子元素,第二个例子表示上下文节点的所有xlink属性。 节点测试node()表示所有类型的节点,包括元素、注释、文本、处理指令等。node()不接收参数。例如,/self::node()表示文件的根节点。 节点测试还可以是comment()、text()、processing-instruction(),表示节点的类型是注释、文本或处理指令,comment()和text()不接收参数,processing-instruction()可以接收参数,如/descendent::processing-instruction( xml-stylesheet )表示文件中以<?xml-stylesheet打头的处理指令。没有参数的processing-instruction()表示不对处理指令的名称作限制。由于注释、文本和处理指令类型的节点都不包含属性和元素,因此不能在包含这几个节点测试的位置步后,添加查找属性或者元素的位置步。如"/descendent::processing-instruction( xml-stylesheet )/attribute::href"就不是一个合法的位置路径。 谓词 XPointer位置步可以包括零个或多个谓词对结果集进行过滤。它将不满足谓词条件的候选节点过滤掉,关键字和节点测试首先确定候选节点的列表,谓词在其中选取最后的结果。其实,节点测试可以看成是谓词的特例。 一般来说,谓词应该是一个布尔表达式,它对每个候选节点计算表达式的值,如果返回值为真,则该节点满足谓词,从而被保留在结果集中,否则节点将从结果集中删除。但有时谓词的计算结果不是一个布尔表达式,返回值可能是字符串、数字、节点集合等。XPointer将返回结果转换为布尔值以确定候选节点是否满足谓词。 非0数字转换为true,数字0和NaN转换为false,NaN是"Not a Number"的简写,常用于表示被0除或其他非法运算的结果; 非空节点集合转换为true,否则转换为false; 非空节点片断转换为true,否则转换为false; 长度不为0的字符串(包含字符串"false")转换为true,否则转换为false; XPointer中,最常用和最重要的谓词是表示位置的谓词,XPointer包括几个谓词函数position()、last()等。position()表示节点在结果列表中的序号,序号从1开始。该函数常与数字连用,中间用关系运算符=、<>、<、<=、>、>=连接,表示结果节点的位置序号与指定数字满足指定关系运算符。由于position()函数使用非常普遍,XPointer提供了一种简写形式,谓词[position()=n]可以简写为[n]。last()表示列表的节点数目,由于last()的结果是个数字,因此它也可与position()函数连用。此外,谓词中还可以包括位置步,它对谓词中的位置步进行计算,该位置步的上下文节点是当前的上下文节点。如果返回集合为空,则谓词计算结果为false,否则为true,甚至还可以用count()对位置步进行计数。下面给出几个例子: 位置步 含 义 xpointer(/descendant::sepc[postion()=2]) 文件中第2个sepc元素 xpointer(id("_loc")/child::sepc[postion()>=2]) ID值为"_loc"的元素的第2个及其以后的sepc子元素。 xpointer(id("_loc")/ancestor::*[postion()=last()]) 文件中ID值为"_loc"的元素的最外层的包含元素,显然应该是文件的根元素。 xpointer(/descendant::attribute[ID="_loc"]) 查找文件中所有值为_loc的ID属性。 xpointer(/descendant::customer[child::car]) 文件中包含car子元素的所有customer元素。 xpointer(/descendant::customer[count(child::car)>1]) 文件中包含两个以上car子元素的所有customer元素。 7.3.5 XPointer扩展     前面介绍的定位方式来源于XPath,它们同时适用于XPath和XPointer,但是XPointer对XPath进行了扩展。其扩展主要包括: 增加了函数here() 和origin()用于进行位置定位; 将XPath的节点(node)扩展为位置(location),位置可以是节点、点和区域; 增加了区域表达式,用于生成区域; 增加函数start-point() 和end-point(),用于定位节点和区域的起始点和结束点; 增加函数string-range(),用于生成字符串; 增加谓词函数unique(),用于测试XPointer表达式是否只返回一个位置,而不是多个位置或没有返回位置。 定位函数 前面提到,绝对位置的定位可以用根节点,或者指定了ID属性值的元素,对应的函数为root()和id(),其中root()可以简写为"/"。除了这两个函数外,XPointer还提供两个函数定位位置,它们是here()和origin()。 here()函数返回当前元素,即包含当前XPointer的元素,经常用于构造链表。下例表示一本名为《XML初学进阶》的书,它包括十章,每一章包括指向前一章和后一章的链接。为简短起见,省略了文件的DTD。 <?xml version="1.0" encoding="gb2312" ?><BOOK xmlns:xlink = "http://www.w3.org/1999/xlink"      name = "XML初学进阶"      author = "XML中国论坛">  <CHAPTER>    第一章 XML基本概念    <LINK xlink:type = "simple"           xlink:href = "here()/following::CHAPTER [1]">    下一章</LINK>  </CHAPTER>  <CHAPTER>    第二章 XML基本语法    <LINK xlink:type = "simple"           xlink:href = "here()/preceding::CHAPTER [1]">    上一章</LINK>    <LINK xlink:type = "simple"          xlink:href = "here()/following::CHAPTER [1]">    下一章</LINK>  </CHAPTER>  ……  <CHAPTER>    第十章 XML应用    <LINK xlink:type = "simple"          xlink:href="here()/preceding::CHAPTER [1]">    上一章</LINK>  </CHAPTER></BOOK> 关于origin()函数的含义有一些混淆的地方,按照XPointer的当前版本的规范,origin()函数和here()函数基本相同,但origin()函数用于外联链接(out-of-line),表示资源文件中链接激活处的元素。但是由于XLink的最新版本规范中已经没有了外联链接的概念,因此XPointer中的解释失去了意义,也许可以将外联链接理解为链接库。出现这个问题的原因是XPointer和XLink的规范不同步,XPointer的候选标准推出比XLink候选标准推出早了约一个月,但与XLink相关的部分还按照XLink规范的老版本。希望在两个规范推出正式标准时不会出现这个问题。 点 前面介绍的位置步都返回XML中的节点,比如:元素、注释、处理指令等。它们都是XML中的结构数据,但是有时需要定位的不是一个XML结构,而是XML结构数据中的某一部分。比如:在CDATA数据中定位部分数据,或者在日期中定位月份时,就必须用到点(point)进行定位。XPointer中的点表示XML文件中节点和字符前后的位置。 如果点的包含节点是可以包含子节点的元素或根节点,则该点称为节点点(node-point)。此时索引是按照节点进行的,索引号0表示所有子节点之前的位置,索引号n表示第n个子节点之后的位置。如果点的包含节点不能包含子节点,此时的点称为字符点(character-point),此时索引是按照字符进行的,索引号0表示所有字符之前的位置,索引号n表示第n个子字符之后的位置。例如: //descendant::sepc[position()=1]/point()[position()=0] 表示文件中第一个sepc元素的第一个子节点前的位置。 //descendant::sepc[position()=1]/child::text()/point()[position()=3] 表示文件中第一个sepc元素的文本中第3个字符后的位置。 区域 区域是由起始点(start point)和结束点(end point)定义的一个连续块,它可以包括起始点和结束点之间的任何XML结构,比如节点、字符串或节点片断等。起始点和结束点相同的区域是空区域。区域从一个点开始,到另一个点结束。每个点是由位置路径指定,如果起始点的位置路径返回位置集合,则起始点为位置集合的第一个点。如果结束点的位置路径返回位置集合,则结束点为位置集合的最后一个点。 区域的形式为xpointer(start-point/range-to(end-point)),其中start-point是一个位置路径,表示区域的起始点,end-point是另一个位置路径,表示区域的结束点,range-to()是一个函数,其参数是位置路径,表示整个位置路径的计算结果是一个区域。例如: xpointer(//descendant::sepc[position()=1]/child::text()/point()[position()=0]/range-to (//descendant::sepc[position()=1]/child::text()/point()[position()=5])) 表示文件中第一个sepc元素的文本中的前5个字符组成的字符串。 XPointer提供了start-point() 和end-point()函数,用于计算区域或位置集合的起始点和结束点。另外,还提供了两个区域函数range()和range-inside(),它们都以位置集合作为参数,返回结果也是位置集合。range()函数将位置集合中的每一个位置转换为一个覆盖该位置的最小区域,然后构成一个新的位置集合。range-inside()函数将位置集合中的每一个位置转换为一个覆盖该位置内容的最小区域,然后构成一个新的位置集合。对于位置集合参数的每一个位置x,如果x是一个区域,则将x直接加入结果集合,否则x将被视为新区域起始点和结束点的包含节点,将起始点和结束点之间的区域加入结果集合。比如对一个元素节点,其起始点在元素的第一个子节点之前,结束点在所有的子节点之后,因此最后的计算结果是该元素的内容。 字符串匹配 严格来讲,字符串匹配的返回结果是一个字符串区域,因此应该属于区域的范畴。但是由于字符串匹配比较重要和常用,因此将其列出单独介绍。 字符串匹配是通过string-range()函数实现。其基本形式是: string-range(location-set,substring,index,length) 其中index和length是可选的。string-range()函数在指定的位置集合(由参数表中的location-set指定)中匹配指定的字符串(由参数表中的substring指定),index用于指定返回字符串区域的第一个字符的位置,该位置是相对于匹配位置的起始点,缺省值为1,表示返回字符串区域从匹配的第一个字符开始。length表示返回字符串的长度,缺省为查找字符串的长度。string-range()函数的返回结果是所有匹配字符串区域构成的集合。substring可以是空串,表示上下文节点的文本内容。例如: xpointer(string-range(/,"",1,8)[position()=1]) 表示文件中的文本数据的前8个字符。 xpointer(string-range(//sepc[position()=1],"date",2,2) 表示选择在文件中第一个sepc元素内出现的所有"date"字符串中的"at"子串。 最后提醒几点:字符串匹配是大小写敏感的;文件中的连续空白字符被视为一个空白字符处理;字符串匹配不考虑标记字符。 7.3.6 字符转义     一般而言,XPointer不会单独出现,其经常出现的位置是URI、XML文件中,这些上下文对一些特殊字符提出了转义要求,因此必须对XPointer中出现的相应字符进行转义。 URI编码和转义 XPointer可以用于XLink的属性xlink:href定位资源片段,xlink:href属性值必须是URI,而一些字符不能直接出现在URI中,因此必须对这些字符进行转义。 URI中不允许出现的字符包括所有非ASCII字符和IETF RFC 2396排除的字符,但是其中的"#"、"%"和方括弧可以直接出现在URI中,这是由IETF RFC 2732定义。所有不允许的字符按照如下顺序进行转义。 每一个不允许的字符转化为相应的UTF-8(IETF RFC 2279)编码; 所有不允许的字符按照URI规则进行转义,即转化为%HH,HH是该字节的十六进制编码; 原有的字符序列用新的字符序列替换。 例如: xpointer(id( résumé )) xpointer(//*[@id= résumé ]) 转义为: xpointer(id( r%C3%A9sum%C3%A9 ))%20 xpointer(//*%5B@id= r%C3%A9sum%C3%A9 %5D) 注意:虽然IETF RFC 2732允许方括弧直接出现,但是为了兼容那些未实现该标准的程序,方括弧最好转义出现。 XML转义 由于XPointer是出现在XML文件中,必须按照XML的要求对相应的字符进行转义。包括"<"、"&"和XML规范规定的其他特殊字符,"<"和"&"转义后分别为"&lt;"和"&amp;",其他特殊字符的转义可以参考XML规范中的规定。例如: xpointer(//book/chapter[position()<=5]) 转义为: xpointer(//book/chapter[position() &lt;= 5]) XPointer转义 XPointer本身对一些字符提出了转义要求。为了保证正确识别和计算,XPointer的各个部分(XPointer的一个部分是指一个完整的XPointer(…),多个XPointer(…)连接起来形成一个完整形式的XPointer)要求括弧匹配,因此必须对不匹配的括弧进行转义,即使在字符串常量中的括弧也必须进行转义。转义的方法是在前面加上一个"^",如果表达式中出现"^",则在前再加一个"^",即用"^("代替"(",用"^)"代替")",用"^^"代替"^"。 注意:转义只是针对不匹配的括弧,而不是对所有括弧。 7.4 XML Base     在HTML链接中,当指定链接的相对路径时,基础路径一般是当前路径,但人们可以用BASE元素显式指定相对路径的基路径,在进行路径解析时,浏览器将BASE指定的路径与相对路径连接起来,形成资源的绝对路径。例如: ……<BASE href = "http://www.htmllink.com/">……<
xiaoqiao_xml 发表于 2005/12/28 12:53:22

阅读全文(2839) | 回复(1) | 编辑 | 精华



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
 
♀链接


♀留言板
签写新留言

HOHO
用户名称:
登陆密码:
密码保存:




站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144821007 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号