XLL(可扩展的链接语言,eXtensible Linking Language)分为两部分:XLink和XPointer。XLink(即XML链接语言,XML Linking Language)定义一文档如何与另一文档的链接。XPointer(即XML指针语言,XML Pointer Language)定义文档的各部分如何寻址。XLink指向URI(实际为URL),以指定特定的资源。此URL可能包含XPointer部分,更明确地标识目标资源或文档所期望的部分或节。本章探讨XLink,下一章将探讨XPointer。
本章的主要内容如下:
* XLink与HTML链接的对比
* 简单链接
* 扩展链接
* 外联链接
* 扩展链接组
* 如何重新命名XLink特性
16.1 XLink与HTML链接的对比
Web征服已经建立起来的Gopher协议的一个主要原因是:在文档中可嵌入超文本链接。这些链接可以嵌入影像或让用户从一文档内部跳转到另一文档或同一文档的另一部分。在某种程度内,XML可转变成其他格式以便于浏览,HTML用于链接的句法与XML文档中使用的句法是一样的。使用XSL,可将各自的句法转变成HTML句法,就像第14章的几个例子中所看到的那样。
但是,HTML链接具有局限性。首先,URL通常只限于指向单一文档。如果比这种要求更为详细如链接于一文档中第17段的第三句,就需要手工在目标文件中插入命名的定位符(锚)。如果对链接的文档没有写访问权,是不会做到这一点的。
而且,HTML链接不保留文档之间的历史或关系内容。尽管浏览器可以跟踪浏览的一系列文档的路径,但这种跟踪是很不可靠的。从HTML内部,没有任何方法知道读者是从哪里来的。链接纯粹是单方向的。用来链接的文档知道它正与谁进行链接,但反过来则不行。
XLL可获得文档间的更强有力的链接。它是专为XML文档设计的,但有些部分也可以与HTML文档一起使用。XLL可以实现使用HTML的基于URL超文本链接和定位可获得的任何功能。但是,除此之外,它还支持多方位的链接,即以多个方向同时进行链接。任何元素都可以成为一个链接,而不仅仅是A元素。甚至不需要将链接保存在与链接文档相同的文件中。此外,XPointer部分(将在下一章讨论)允许对XML文档中的任意位置进行链接。这些功能使XLL不仅更适合于新的用途,而且还适合于只使用HTML要花很大气力才能达到的功能,如交叉引用、脚注、尾注、互连数据等等。
请读者注意,直到编写此书时(1999年春天),XLL仍处于重大的开发和修改阶段。尽管正在逐渐成形,但在读者阅读本书时可能会或多或少地发生变化。
此外,到目前为止,还没有任何一个多用途的应用程序能支持任意的XLink。这是因为XLink的适用性要比HTML链接广得多。XLink不仅仅用于超文本的连接,还可用于在文档中嵌入影像。可被任何一个需要在文档和文档的局部之间建立连接的常用应用程序用于任何目的。因此,甚至当XLink在浏览器中得以完整执行时,也许并非总是单击可跳转到另一页的蓝色下划线文本。可以是那样,但也可以根据需要决定蓝色的下划线文本的多寡。
16.2 简单链接
在HTML中,链接是用<A>标记来定义的。但就像XML使用描述元素的标记更灵活一样,使用引用外部资源的标记也更为灵活。在XML中,几乎任何标记都可以是一个链接。包括链接的元素称作链接元素(linking element)。
链接元素是由值为simple或extended的xlink:form特性来标识的。而且,每个链接元素包含一个值为链接资源的URI的href特性。例如,下面是三个链接元素:
<FOOTNOTE xlink:form="simple" href="footnote7.xml">7</FOOTNOTE>
<COMPOSER xlink:form="simple" inline="true"
target="_blank" href="http://www.cncfan.com/outurl.asp?url=http://www.users.interport.net/~beand/">
Beth Anderson
</COMPOSFR>
<IMAGE xlink:form="simple" href="logo.gif"/>
注意,此元素具有描述它们所包含内容的语义名称,而不是这些元素如何表现。这些元素使链接的信息包含在标记的特性中。
这三个例子是简单的XLink。简单的XLink类似于标准的HTML链接,并在更复杂(以及功能强大)的扩展链接之前很可能为应用程序的软件所支持,所以,我首先使用它们。扩展链接在下节讨论。
在上面的FOOTNOTE实例中,链接目标特性名为href。其值为相对的URL footnote7.xml。此文档的协议、主机以及路径都取自出现这种链接的文档中的协议、主机以及路径。
在上面的COMPOSER示例中,链接目标特性名为href。此href特性值为绝对的URL http: //wwwusers.interport.net/~beand/。在上面的第三个示例IMAGE中,链接目标特性名为href。此href特性值为相对的URL logo.gif。这时同样本文档的协议、主机以及路径都取自出现这种链接的文档中的协议、主机以及路径。
如果文档有一个DTD,那么这些特性必须和其他特性一样进行声明。例如,FOOTNOTE、COMPOSER和IMAGE元素的DTD声明可以按下面的方式进行:
<!ELEMENT FOOTNOTE (#PCDATA)>
<!ATTLIST FOOTNOTE
xlink:form CDATA #FIXED "simple"
href CDATA #REQUIRED
>
<!ELEMENT COMPOSER (#PCDATA)>
<!ATTLIST COMPOSER
xlink:form CDATA #FIXED "simple"
href CDATA #REQUIRED
>
<!ELEMENT IMAGE EMPTY>
<IATTLIST IMAGE
xlink:form CDATA #FIXED "simple"
href CDATA #REQUIRED
>
使用这些声明,xlink:form特性就有一个确定值。所以,这一特性就不需要包括在元素的实例中,现在可以将这些元素按照下列方式书写得更简洁一些:
<FOOTNOTE href="footnote7.xml">7</FOOTNOTE>
<COMPOSER target="_blank" href="http://www.cncfan.com/outurl.asp?url=http://www.users.interport.net/~beand/">
Beth Anderson
</COMPOSER>
<IMAGE href="logo.gif"/>
使一元素成为链接元素对元素的其他特性或内容不存在限制。链接元素可以包含任意的子元素或其他特性,当然总是受制于DTD。例如,下面为IMAGE元素的更真实的声明。注意,大多数特性与链接无关。
<!ELEMENT IMAGE EMPTY>
<!ATTLIST IMAGE
xlink:form CDATA #FIXED "simple"
href CDATA #REQUIRED
ALT CDATA #REQUIRED
HEIGHT CDATA #REQUIRED
WIDTH CDATA #REQUIRED
>
16.2.1 本地资源的描述
链接元素可以包含可选的content-role和content-title元素,这两个元素用于在链接元素出现的文档内提供附加的信息,并进一步描述此链接的目的。例如:
<AUTHOR href=
http://www.macfaq.com/personal.htmlcontent-title="author of the page"
content-role="whom to contact for questions about this page">
Elliotte Rusty Harold
</AUTHOR>
content-role和content-title特性描述本地资源,即链接元素的内容(本例中的Elliotte Rusty Harold)。但是,这些特性不描述远程的资源(如本例中为位于http://www.macfaq.com/personal.html处的文档)。因此,本例说明Elliotte Rusty Harold具有"author of the page"的头衔,其作用为"whom to contact for questions about this page"。本例也无需与在http://www.macfaq.com/personal.html处找到的文档有任何关系。
content-title特性通常是由读入XML的应用程序所使用,以便在用户将鼠标移到链接的元素之上时,在浏览器状态条上或通过工具提示为用户显示一些附加信息。但是,应用程序不一定要为用户显示这种信息。如果此特性选择了这么做,那么它就只能如此。
content-role特性表示文档中链接元素的目的。此特性与准备将数据传递给读入XML的应用程序中的处理指令相类似。可是,它的真正目的并不是作为XML来使用,并且应用程序可以任意忽略此特性。
像所有的其他特性一样,content-title和content-role为了用于包含它们的所有元素也应在DTD中进行声明。例如,下面的合理声明可用于上面的AUTHOR元素:
<!ELEMENT AUTHOR (#PCDATA)>
<IATTLIST AUTHOR
xlink:form CDATA #FIXED "simple"
href CDATA #REQUIRED
content-title CDATA #IMPLIED
content-role CDATA #IMPLIED
16.2.2 远程资源的描述
链接元素可以包含可选的role和title特性,用来描述远程资源,即链接所指向的文档或其他资源。例如:
<AUTHOR href=
http://www.macfaq.com/personal.htmltitle="Elliotte Rusty Harold s personal home page"
role="further information about the author of this page"
content-title="author of the page"
content-role="whom to contact for questions about this page">
Elliotte Rusty Harold
</AUTHOR>
role和title特性描述远程资源,而不是本地元素。在上面的实例中,远程资源就是http://www.macfaq.com/personal.html处的文档。因此,下面的实例说明http://www.macfaq.com/personal.html处的网页标题为“Elliotte Rusty Harold s personal home page",作用为"further information about the author of this page"。要使title与链接网页的TITLE元素内容相同是很平常的,尽管不必这样做。
读入XML的应用程序可以使用这两个特性来为用户显示附加的信息。但应用程序无需将这种信息显示给用户或用它来做任何事。
在链接文档(链接出发的文档)中,role特性说明远程资源(被链接的文档)的目的。例如,可用特性来区别脚注、尾注和引文。
与所有的其他特性一样,为了用于包含它们的所有元素,应在DTD中声明title和role特性。例如,下面的合法声明可用于上面的author元素:
<!ELEMENT AUTHOR (#PCDATA)>
<!ATTLIST AUTHOR
xlink:form CDATA #FIXED "simple"
href CDATA #REQUIRED
content-title CDATA #IMPLIED
content-role CDATA #IMPLIED
title CDATA #IMPLIED
role CDATA #IMPLIED
>
16.2.3 链接行为
链接元素可以包含三个可选特性,这些特性可以建议应用程序如何将远程资源与当前页关联。下面即为这三种特性:
1.show
2.actuate
3.behavior
show特性提示当激活链接时,应如何显示内容,例如,通过打开一个新窗口来保存内容。actuate特性提示此链接是否可以自动切断或是否要求有明确的用户请求。behavior特性可为应用程序提供有关如何准确地切断链接的详细信息,如在切断链接之前的一段时间迟延。但是,这些特性都是与应用程序相关的,并且应用程序可任意忽略这些提示。
16.2.3.1 show特性
show特性有三个合法值:replace、new和embed。
当激活链接(通常是由单击此链接而发生的,至少在GUI浏览器中是如此)时使用replace值,则链接的目标代替同一个窗口中的当前文档。这是HTML链接的缺省行为。例如:
<COMPOSER target="_blank" href="http://www.cncfan.com/outurl.asp?url=http://www.users.interport.net/~beand/"
show="replace">
Beth Anderson
</COMPOSER>
使用new值时,激活链接就打开新的窗口,以显示目标资源。这种行为与target特性设置为_blank时的HTML链接类似。例如:
<WEBSITE target="_blank" href="http://www.cncfan.com/outurl.asp?url=http://www.quackwatch.com/" show="new">
Check this out, but don t leave our site completely!
</WEBSITE>
读者不希望在单击链接后打开新的窗口,倒希望在单击链接后,把新页加载到当前窗口中,除非明确地要求在新窗口中打开这种链接。
有些公司相当自傲,以至他们认为任何一个用户从不会离开他们自己的站点。于是,他们就“帮助”读者打开新的窗口。在大多数时候,这只能使读者感到困惑和厌恶。如果没有一个很好的理由,就不要改变用户所期望的那种行为。让读者在站点上花费额外的两秒钟,或者多浏览一页,多看一页的广告,这种浮浅的欲望是毫无道理的。
使用embed值,激活链接将会在现有的文档中插入目标资源。其准确的含义是与应用程序相关的。但是,可以想象,此值用于Web页的客户端"嵌入"功能。例如,下面的这个元素(并没有直接包括家庭成员的各个元素)将家庭成员的各个元素从各自的文件ThomasCorwinAnderson.xml、LeAnahDeMintEnglish.xml、JohnJayAnderson.xml和SamuelEnglishAnderson.xml中复制出来。
<FAMILY ID="f732">
<HUSBAND href="ThomasCorwinAnderson.xml" show="embed"/>
<WIFE href="LeAnahDeMintEnglish.xml" show="embed"/>
<CHILD href="JohnJayAnderson.xml" show="embed"/>
<CHILD href="SamuelEnglishAnderson.xml" show="embed"/>
</FAMILY>
切断链接并将其内容嵌入到FAMILY元素中之后,结果如下所示:
<FAMILY ID="f732">
<PERSON ID="plO35" SEX="M">
<NAME>
<GIVEN>Thomas Corwin</GIVEN>
<SURNAME>Anderson</SURNAME>
</NAME>
<BIRTH>
<DATE>24 Aug 1845</DATE>
</BIRTH>
<DEATH>
<PLACE>Mt. Sterling, KY</PLACE>
<DATE>18 Sep 1889</DATE>
</DEATH>
</PERSON>
<PERSON ID="pl098" SEX="F">
<NAME>
<GIVEN>LeAnah (Lee Anna, Annie) DeMint</GIVEN>
<SURNAME>English</SURNAME>
</NAME>
<BIRTH>
<PLACE>Louisville, KY</PLACE>
<DATE>1 Mar 1843</DATE>
</BIRTH>
<DEATH>
<PLACE>acute Bright s disease, 504 E. Broadway</PLACE>
<DATE>31 Oct 1898</DATE>
</DEATH>
</PERSON>
<PERSON ID="pll02" SEX="M">
<NAME>
<GIVEN>John Jay (Robin Adair )</GIVEN>
<SURNAME>Anderson</SURNAME>
</NAME>
<BIRTH>
<PLACE>Sideview</PLACE>
<DATE>13 May 1873</DATE>
</BIRTH>
<DEATH>
<DATE>18 Sep 1889 </DATE>
</DEATH>
</PERSON>
<PERSON ID="p37" SEX="M">
<NAME>
<GIVEN>Samuel English</GIVEN>
<SURNAME>Anderson</SURNAME>
</NAME>
<BIRTH>
<PLACE>Sideview</PLACE>
<DATE>25 Aug 1871</DATE>
</BIRTH>
<DEATH>
<PLACE>Mt. Sterling, KY</PLACE>
<DATE>10 Nov 1919</DATE>
</DEATH>
</PERSON>
</FAMILY>
尽管每个PERSON元素都存在于独立的文件中,但处理全部的FAMILY元素就像是在一个文件中一样。
像合法文档中的所有特性一样,对于DTD的链接元素,show特性必须在<!ATTLIST>声明语句加以声明。例如:
<!ELEMENT WEBSITE (#PCDATA)>
<!ATTLIST WEBSITE
xlink:form CDATA #FIXED "simple"
href CDATA #REQUIRED
show (new | replace | embed) "new"
>