《XML技术教程》第7章XML链接.ppt
第七章 XML链接,XML实用教程,要点及主要内容,XLink与HTML链接的区别 XLink中的简单链接与扩展链接 XLink中几个重要属性的含义和用途 使用XPointer定位XML文档片段的方法如何在XML链接中加入XPointer和XML Base的含义即用法,7.1 XLink与HTML链接的区别,HTML链接的局限性:HTML链接的单向性,不知道它有哪些链接源点 HTML不能表现多个链接的关系和结构信息HTML的链接 可能会出现协作问题,XML链接的优越性:XML可以建立除XML文档之外的其他类型数据间的链接XML允许链接的建立者利用文件结构指定文件内部的资源片断 XML链接具有简单链接和扩展链接 利用XML链接技术可以实现在一个XML文档内部的定位 利用链接库,可以将链接信息从XML文档中分离出来从而简化链接的管理,7.2 XLink中的简单链接与扩展链接,链接术语:链接(Link)链接元素(Linking element)资源(Resource)内建链接 定位器(Locator)参与资源(Participation resource)本地资源(Local resource)远程资源(Remote resource)游历(Traversal)弧(Arc)XLink应用 简单XML链接(Simple XML Links)扩展链接(Extended XML Links),简单XML链接XML的灵活性和可扩展性:XML链接元素可以包含的属性:1.xlink:type属性 2.xlink:href属性 3.xlink:title、xlink:role属性 4.xlink:show和xlink:actuate属性,7.2 XLink中的简单链接与扩展链接,简单XML链接例数据库系统概论计算机网络,7.2 XLink中的简单链接与扩展链接,为了访问 XLink 的属性和特性,我们必须在文档的顶端声明 XLink 命名空间。xmlns指定XLink的名称空间“http:/www.w3.org/1999/xlink”;book元素和description元素中包含了XLink的属性,我们称其为链接元素;xlink:type属性的取值为“simple”,表示该链接是一个简单XML链接;xlink:href属性指定要联接的URL。在这一点上,它和HTML一样;xlink:show属性的取值为“new”,表示链接激活时在新开窗口显示目标资源;xlink:actuate属性的取值为“onLoad”,表示当初始文档装入时,即载入该资源;,7.2 XLink中的简单链接与扩展链接,扩展XML链接,扩展链接的组成结构:,扩展XML链接元素通常由一个资源集合和一个连接集合组成资源集合可以包括本地资源和远程资源,如果资源是XML链接元素的组成部分,则该资源是本地资源,否则就是远程资源,比如另外的XML文档或本文档的其他元素。连接集合中的各元素表示资源集合元素之间的链接。除了资源集合和连接集合以外,扩展XML链接元素还可以包括其他内容或标记,甚至可以包含简单XML链接或扩展XML链接作为其子元素。,7.2 XLink中的简单链接与扩展链接,扩展XML链接,扩展链接的属性:,1xlink:type属性扩展XML链接的xlink:type属性值固定为“extended”。2xlink:role和xlink:title属性扩展链接也可以具有语义属性,即上节介绍过的xlink:title和xlink:role属性,其意义与简单链接中的相似,只不过是用于描述整个链接。注意:和简单链接不同,扩展链接元素并不包含href属性,为了指明参与链接的不同位置及链接之间的连接,我们有必要使用子元素locator和arc。,7.2 XLink中的简单链接与扩展链接,扩展XML链接,创建本地资源元素:,本地资源元素的元素名可以任意,本书我们暂以resource代表本地资源元素。:resource元素的定义如下:,resource本地资源元素可以有四个属性,7.2 XLink中的简单链接与扩展链接,扩展XML链接,创建远程资源元素:,远程资源元素的元素名可以任意,本书暂以locator代表远程资源元素。locator元素的定义如下:,locator远程资源元素可以有五个属性,7.2 XLink中的简单链接与扩展链接,扩展XML链接,创建链接弧元素:,链接弧元素的元素名可以任意,本书暂以arc代表链接弧元素。locator元素的定义如下:arc元素的定义如下:,arc链接弧元素可以有七个属性,7.2 XLink中的简单链接与扩展链接,扩展XML链接,创建标题元素:,标题元素的元素名可任意,本书暂用title代表,title类型元素可以包含任意内容、属性,也可以包含子元素,因此可以实现资源的描述和内部结构。title类型元素可以作为本地资源元素、远程资源元素或链接弧元素的直接子元素出现。下面是title类型元素的一个可能的DTD声明及实例。其中一个属性xml:lang,用来指定一种语言。,arc链接弧元素可以有七个属性,7.2 XLink中的简单链接与扩展链接,扩展XML链接,链接库:,一个包含入站链接弧或第三方链接弧集合的文件称为链接库(linkbase),链接库必须是一个XML文档,它使得链接管理相对容易。创建链接库是为了将资源与链接分离开来,可以对它们分别进行编辑和修改。通过链接库文件,可以为一个只读文件增加一个链接,就像XSL文档将XML的数据内容与表现方式分离开来一样。,通过将链接库弧的起始资源指向另一个链接库弧,还可以形成一个链接库链。链的长度可以由初始的链接弧限定。也就是说,一个链接库中包含有对另外一个链接库的引用。应用程序可以沿着这些链接,随意往下搜索。,XPointer(XML Pointer Language,XML指针语言)是关于XML指针的规范,它的主要功能是在XML文档中定位片段(fragment),它可以用于需要文档内部定位的任何应用场合,比如在可视化的XML编辑器中用于描述用户选择的节点或字符串等等。但最常见的是使用XPointer描述XLink链接的目标资源,在XML链接中,通常将它加到URL的结尾,更明确地表示目标资源的某个片段。本节将讲述XPointer的语法,以及它如何与XML结构化文档相关联。,7.3 XPointer语言,7.3.1 XPointer概述,XML是结构化的文档,借助文档结构进行的内部定位即成为可能,这就是XPointer语言的主要功能,它支持在XML文档中定位元素、属性、字符串等内部结构。与HTML的命名锚定位法相比,XPointer的优越性体现在,XPointer可以创建到文档任何部分的链接,而不必在目标文档中放置链接元素。因而,XPointer不仅允许链接本地站点上文档的片段,而且可以链接其它站点的文档。XPointer是XPath表达式语言的扩展,和XPath一样,XPointer用于标识XML文档的部分和片段。当作为XLink的部分使用时,Xpointer表达式称为段标识符。XPointer在XPath语言的基础上进行的扩展包括:除了对节点的定位,还支持对某点或者某个区域的定位。“点”是指文档内容中的某个位置,“区域”是指两“点”中间的连续文档内容;通过字符串匹配来定位资源片段等相应信息;在URI引用中使用定位表达式作为文档片段的标识符。,在XML链接中加入XPointer的方法很简单,在目标文档的URI结尾加上一个“#”号和一个XPointer段标识符即可。XPointer规范还允许链接到指定文档的一个片段,而忽略文档的其它部分,这时,需要将符号“#”换成符号“|”。本书前面章节已介绍过XPath的基本语法,XPath是通过轴、谓词和函数来对XML文档中树型结构的各部分进行选择的。XPointer的基本思想也是如此。XPointer还可以表达多个这样的选择,而且依次在前面所选的结果中再次进行选择。XPointer语法中,对XML文档的片段进行标识的形式有三种:完整形式(Full XPointer)、无修饰名称(bare name)或子节点序列(child Sequence)。其中,后两种属于完整XPointer定位的简记形式。,7.3 XPointer语言,7.3.2 XPointer的三种形式,1.完整形式的XPointer 完整形式的XPointer可以包括由一个或多个XPointer部分(XPointer Part),各部分之间可由空格分开,也可以没有任何分隔符。每个XPointer部分以“xpointer”开始,其后紧跟一个表达式,该表达式用括号括起,表示根据此表达式进行定位计算。这个表达式是一个位置路径(Location Path),我们将在下一小节作具体说明。包含多个部分的XPointer是从左至右逐个部分计算,首先计算第一部分,如果第一个XPointer部分运算失败,将运算第二个XPointer部分,直至得到运算结果或处理完所有的部分。,2.无修饰名称 在表达式xpointer(id(XX)中,利用id()进行元素定位,表示选取文档中ID属性值等于指定值的元素,由于这种定位方式很常用,因此XPointer语言提供了一种简写方式,可以将xpointer(id(name)简写成name。我们称之为无修饰名称(bare name)。,3.子节点序列 XPointer还提供了子节点序列的定位方式,它通过逐层地导向对元素进行定位。子节点序列是由一系列数字和斜杠“/”组成的序列,其中“/”用于分隔数字,数字n表示前面定位元素的第n个直接子元素,是child:*position()=n的简写。其中,子节点序列不考虑元素的名称和类型,在序列前可以是刚才提到的无修饰名称,表示从ID属性为指定名称的元素开始定位,否则数字序列必须以“/1”作为开头,它表示文件的根元素。文档中的其他节点,如属性、注释等,不能用子节点序列定位,由于文档的根节点没有父节点,因此也不能用子节点序列的形式来定位根节点。注意,文档的根节点和根元素不是同一个概念。根节点是一个包含整个文件的抽象节点,包括XML声明、DTD、处理指令等,而根元素是文件中最外层的元素,它是根节点的直接子元素。根节点用“/”表示,而根元素用“/1”表示。,7.3 XPointer语言,7.3.3 位置路径和位置集合,完整形式的XPointer表达式是一个位置路径(Location Path),它与XPath中的位置路径相同。位置路径是由“/”分隔的位置步(Location Step)构成的。位置路径可以是绝对的,也可以是相对的。绝对路径就是从文档的根“/”开始按照元素在文档树中的具体位置指定一个绝对的路径,它的参照物就是文档的根。绝对路径起始于正斜杠(/)。而相对路径不以正斜杠开头,它是指从当前所处的元素开始,以当前元素为参照物,经定位的条件寻找到目标元素。,在绝对路径和相对路径两种情况中,位置路径均包括一个或多个步,每个步用斜杠分隔。绝对位置路径的语法是:/step/step/.相对位置路径的语法是:step/step/.每个步均根据当前节点集之中的节点来进行计算。步在链接的目标文档中指定一个位置,通常是相对于一个已知的位置,如文档的根节点或另外一个位置步等。位置步由轴、节点测试和可选的谓词三个部分构成,其形式为:轴:节点测试谓词 例如,descendant:bookposition()=3。,多个位置步用“/”相连构成位置路径,在计算定位元素时将从左到右计算,首先计算第一个位置步,得到位置,下一个位置步的计算就相对于这一个位置,依次向下计算。即得到最后结果。例如:/child:Books/child:bookposition()=2 其中第一个“/”表示文档的根节点,“child:Books”是第一个步,表示根节点的Books直接子元素,如果文件的根元素是Books,计算出来的结果应为根元素,否则计算结果为空;“child:bookposition()=2”是第二个位置步,表示上次计算出来元素的第二个book直接子元素。在上面的例子中,如果文件的根元素是Books,而且它包含两个以上的book子元素,返回的结果将是一个元素,否则将不返回结果。位置路径可以照此继续构造下去。位置路径的计算结果我们称之为位置集合。如果位置论据返回的结果只包含一个元素,则位置集合只包含一个元素,比如上面这个例子;如果位置路径不返回任何结果,我们称位置集合是空集;位置路径的返回的结果还可以包含多个元素,比如,若将以上位置路径改为:/child:Books/child:bookposition()2,那么,根元素Books的从第三个book子元素开始的所有子元素都将作为结果返回,则位置集合包含多个元素。,与普通集合不同的是,位置集合中的元素是有序的。其具体排序规则由关键字决定。XPointer中位置路径的概念和XPath中的一致,也可以采用和XPath中一样的简略语法来书写XPointer的定位表达式。例如:#xpointer(/child:Books/child:bookposition()=2)可简写为#xpointer(/Books/book2)。具体请读者参考第四章,这里不再赘述。由于XPointer可以用于XLink中表示资源,而XPointer可能返回多个节点构成的集合。因此XLink必须处理多个节点的情况。XLink规定,如果链接的起始资源含有多个节点,则将每个节点作为一个单独的起始资源,反应在浏览器上就是每个节点都有一个到目标资源的链接。如果链接的结束资源包含多个节点或者不是节点类型(点或区域),则将其作为统一的资源处理。,7.3 XPointer语言,7.3.4 XPointer对XPath的扩展,在XPointer中,包含了一些XPath中没有的重要概念和函数,这些扩展主要体现在:1.新引入了点和区域的概念,这是两种新的定位类型;点是某个节点或字符前后的位置,区域是两个点之间的所有结构和数据。2.将XPath中的节点(node)和节点集的概念扩展为位置(location)和位置集合,在XPointer语法中,位置可以是节点、点或者区域;3.在XPath的基础上提供了一些新增的函数;,7.3 XPointer语言,7.3.4 XPointer对XPath的扩展,我们对上述几个方面的扩展进行具体说明:,(1)点(point)使用XPath,我们可以在XML文档中选取一个特定的元素、属性、处理指令等节点,但是却无法定位其中的非XML文本,比如:在元素内容、CDATA段、注释、处理指令或其它地方定位嵌入的文本,或者在日期中定位月份等等。XPointer规范对此进行了扩展,提出点的概念,并使用点进行定位。XPointer中的点表示XML文件中节点和字符前后的位置。例如:Learing XML10 Feb 2008 XPath表达式不能标识publishDate元素的前两个字符(即日期),但XPointer则可以使用点来定位它们,在上面这个例子中,Books节点前面就是一个点,book节点前面也是一个点,文本L和e之间是一个点,e和a之间也是一个点。也就是说,XPointer的点或者在两个节点之间,或者在文档的已解析字符数据中的两个字符之间。两个点之间的文本片段就是一个区域。,使用点的概念,XPointer能够标识文档的已解析字符数据中的任意位置,但不能指向一个标记中间的某一位置,从本质上看,点所增加的功能是把文本内容划分成更小的节点,每个字符就是一个节点。如果包含某个点(point)的节点可以含有子节点,则该点称为节点点(node-point)。此时索引是按照节点进行的,索引号0表示所有子节点之前的位置,索引号n表示第n个子节点之后的位置。如果包含某个点(point)的节点不能含有子节点,则该点称为字符点(character-point)。此时索引是按照字符进行的,索引号0表示所有字符之前的位置,索引号n表示第n个子字符之后的位置。在XPointer中,增加了函数point()以定位点。例如,对于前面的XML片段,/Books/point()position()=0 表示定位文档中Books元素的第一个子节点之前的那个点;/title/text()/point()position()=3 表示文档中title元素的文本中第3个字符后的那个点。,7.3 XPointer语言,7.3.4 XPointer对XPath的扩展,我们对上述几个方面的扩展进行具体说明:,(2)区域(range)XPointer中,区域是由起始点(start point)和结束点(end point)定义的一个连续块,它包括起始点和结束点之间所有的内容,比如节点、字符串或节点片断等。起始点和结束点都由一个位置路径来标识。起始点和结束点相同的区域称为空区域。如果起始点的位置路径返回的结果是位置集合,则起始点为位置集合的第一个点,如果结束点的位置路径返回的结果是位置集合,则结束点为位置集合的最后一个点。指定一个区域的语法为:xpointer(start-point/range-to(end-point)其中:start-point是一个位置路径,表示区域的起始点;range-to()是一个函数,表示整个位置路径的计算结果是一个区域。range-to()函数的参数是end-point,它是区域结束点的位置路径。例如:xpointer(/title/text()/point()position()=0/range-to(/title/text()/point()position()=5)表示文档中第一个book元素的文本中的前5个字符组成的字符串;xpointer(/Books/bookposition()=0/range-to(/Books/bookposition()=last)表示文档中第一个book元素起始标记和最后一个book元素结束标记之间的所有内容。,7.3 XPointer语言,7.3.4 XPointer对XPath的扩展,我们对上述几个方面的扩展进行具体说明:,(3)区域函数 XPointer提供了几个专门用于区域的函数,其中,大多数都是对位置集合进行操作。位置集合前面已经介绍过,它就是包含点、区域以及节点的节点集合。start-point()函数 用于计算区域或位置集合的起始点,它以位置集合作为参数,返回结果也一个位置集合,其中包含输入的位置集合中每个位置的起点。例如,start-point(/bookposition()=1)返回文档中第一个book元素起始标记后的第一个点;start-point(/book)返回每个book元素起始标记后的点的集合。end-point()函数 用于计算区域或位置集合的结束点,它以位置集合作为参数,返回结果也是一个位置集合,该函数的功能与start-point()函数基本相同,只是它返回的是输入的位置集合中每个位置的之后的点。range()函数 range()函数以位置集合作为参数,它返回一个位置集合。该函数将位置集合中的每一个位置转换为一个覆盖该位置的最小区域,然后构成一个新的位置集合。实质上,这个函数是把位置转化成了区域。,(3)区域函数 range-inside()函数 range-inside()函数以位置集合作为参数,返回结果也是位置集合。该函数将位置集合中的每一个位置转换为一个覆盖该位置内容的最小区域,然后构成一个新的位置集合。也就是说,如果一个位置是一个元素,则返回的位置是该元素的内容,但不包含元素的起始和结束标记,但是如果输入的位置是个区域或点,则位置的内部内容和这个区域或点是相同的。例如,对于位置集合参数的每一个位置x,如果x是一个区域,则将x直接加入结果集合,否则x将被视为新区域起始点和结束点的包含节点,将起始点和结束点之间的区域加入结果集合。比如对一个元素节点,其起始点在元素的第一个子节点之前,结束点在所有的子节点之后,因此最后的计算结果是该元素的内容。,7.3 XPointer语言,7.3.4 XPointer对XPath的扩展,我们对上述几个方面的扩展进行具体说明:,(4)字符串区域XPointer通过string-range()函数提供了一些非常基本的字符串匹配功能。这个函数的参数是要进行搜索的一个位置集合和要找的子串。string-range()函数的基本形式是:string-range(location-set,substring,index,length)其中:location-set参数返回一个位置集合,指定在文档的哪部分中搜索匹配的字符串;substring参数指定要搜索的实际字符串,默认情况下,返回的区域是从第一个匹配字符之前开始的,并且将所有匹配字符包含在内;也就是说,string-range()函数在指定的位置集合location-set中匹配指定的字符串substring;index参数可选,用于指定返回字符串区域的第一个字符的位置,该位置是相对于匹配位置的起始点,缺省值为1,表示返回字符串区域从匹配的第一个字符开始。length参数可选,表示返回字符串的长度,缺省为查找字符串的长度。string-range()函数的返回结果是所有匹配字符串区域构成的集合。substring可以是空串,表示上下文节点的文本内容。,(4)字符串区域一个字符串区域指向一个指定的当前字符串,或文档文本(而不是标记)中给定字符串的子串。例如,xpointer(string-range(/,2008)表示定位到了所有出现的字符串“2008”。字符串区域还可以有谓词,例如,xpointer(string-range(/,2008)position()=1)表示只定位在文档中第一次出现的字符串“2008”。xpointer(string-range(/,2008,3,2)position()=1)表示从首次出现的整个字符串“2008”中选择了“08”子串。注意:字符串匹配是大小写敏感的;文件中的连续空白字符被视为一个空白字符处理;且字符串匹配不考虑标记字符,7.4 XML Base,在HTML链接中,当指定链接的相对URL时,基础路径默认是当前URL路径,我们也可以使用HTML中提供的base元素来显式地指定相对URL路径的基础URL。在进行路径解析时,浏览器将BASE指定的路径与相对路径连接起来,形成资源的绝对路径。例如:图书信息 当激活“图书信息”这个链接时,将显示资源 http:/。XML链接中,也有实现相同的功能的类似机制,即XML Base,简称为XBase。但是XML Base不仅限于XML链接领域,它还可以用于指定相对URI的其他应用。XML Base的指定是通过元素的xml:base属性指定的,前缀xml是用于表示命名空间,类似地,可以用其他前缀代替该命名空间,但考虑到文档的可读性,不提倡这样做。XML Base的作用范围是包括其所有后代节点的整个元素,除非在后代元素指定了新的XML Base。,作为一个有效的(validated)XML文档,xml:base属性应该在DTD中声明。例如,一个DTD声明如下:下面是一个利用上面的DTD定义的元素实例:Learning XML Tompson 这里,book元素内的author子元素的XML Base是“http:/author/”,而在book元素的其它地方,无论是author元素之前或者之后,XML Base仍然是“http:/book/”。此时book元素的xml:base作用范围被author元素的xml:base所屏蔽,这与许多程序设计语言中非局部变量的作用范围是一致的。由于xml:base是作为元素的属性存在的,作用范围是整个元素,而一个格式良好的XML文件的元素不能交叉,因此xml:base的作用范围也不会出现交叉。,7.5 小结,本章分别介绍了整个XML链接机制的三个部分,即XLink技术、XPointer技术和XML Base技术。XLink指定链接如何插入到XML文档中和链接指向何处。是一种允许开发者创建自己的链接元素和创建一种链接数据库的语言;XPointer XPointer和XLink中的URL连用,可以定位XML文档的某个部分,而不是只指向整个文档;XML Base则允许创建者为链接中的相对URL指定一个基础URL,可以在任意元素中包含一个xml:base的属性来设置基础URL。本章详细介绍了XLink、XPointer和XML Base各自的语法与特性,并运用实例对三种技术的具体使用方法进行了讲解。,7.6习题,1.XML中的链接分为哪几个部分?它们各自功能如何?2.简述XLink扩展链接中链接弧元素的xlink:from属性和xlink:to属性的含义及其用法。3.XLink中如何将一个XML文档和它相应的链接库文档关联起来?4.XPointer有哪三种形式?5.XPointer在XPath的基础上做了哪几个方面的扩展?,