XLink 超链接
本章定位 :理解 XLink 如何为 XML 提供超越 HTML
<a>标签的超链接能力——简单链接(simple)、扩展链接(extended)、以及 XPointer 的精确定位机制。
定义与作用
HTML 中超链接只需要 <a href="...">。XML 中没有预定义的 <a> 标签,而且 XML 允许任意元素名——浏览器无法预测哪个元素是链接。
XLink (XML Linking Language)解决了这个问题:它通过一套标准属性(在 http://www.w3.org/1999/xlink 命名空间下),将任意 XML 元素"标记"为超链接。
XPointer 是 XLink 的配套技术:它允许链接 不是指向整个文档 ,而是精确指向文档中的 某个特定位置 (如某个元素、某段文本)。
核心原理:XLink 链接模型
图解释 :XLink 提供两种链接类型——simple 类似 HTML 的 <a>,一对一跳转;extended 支持多对多关系,链接定义甚至可以存放在独立文件中。XPointer 则提供锚点的精确定位能力。
语法/结构要点
XLink 全局属性
| 属性 | 值 | 说明 |
|---|---|---|
xlink:type | simple / extended / locator / arc / resource / title | 定义 XLink 元素类型 |
xlink:href | URL | 目标资源的 URL |
xlink:show | new / replace / embed / other / none | 链接的打开方式 |
xlink:actuate | onLoad / onRequest / other / none | 何时激活链接 |
xlink:show 的行为
| 值 | 行为 | 类比 |
|---|---|---|
new | 在新窗口/标签页打开 | HTML target="_blank" |
replace | 在当前窗口打开(默认) | HTML target="_self" |
embed | 将目标内容嵌入当前文档 | HTML <img>、<iframe> |
none | 不指定行为,由应用决定 | — |
xlink:actuate 的时机
| 值 | 时机 |
|---|---|
onLoad | 文档加载时自动激活 |
onRequest | 用户点击时激活(类似 HTML 链接) |
XPointer 表达式
| 写法 | 说明 |
|---|---|
url#xpointer(id('target')) | 定位到 id='target' 的元素(完整写法) |
url#target | 定位到 id='target' 的元素(简写) |
url#xpointer(//chapter[3]) | 定位到第 3 个 chapter 元素(XPath) |
完整示例
场景说明
飞翔科技的 白歌 维护一份"技术文档目录"XML。她需要在文档之间建立交叉引用——点击某个技术的描述,跳转到对应的详细规范文档。
操作前:无法互链的孤立 XML
<!-- 文档A:技术目录 catalog.xml -->
<catalog>
<tech name="XML Schema">
<desc>定义 XML 文档的结构约束</desc>
<!-- 无法链接到 schema-guide.xml 的详细信息 -->
</tech>
</catalog>
应用 XLink 后:建立超链接
catalog.xml — 使用 XLink simple 链接:
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns:xlink="http://www.w3.org/1999/xlink">
<tech name="XML Schema">
<desc
xlink:type="simple"
xlink:href="schema-guide.xml"
xlink:show="replace"
xlink:actuate="onRequest">
定义 XML 文档的结构约束(点击查看详细规范)
</desc>
</tech>
<tech name="XSLT 转换">
<desc
xlink:type="simple"
xlink:href="xslt-guide.xml"
xlink:show="new"
xlink:actuate="onRequest">
将 XML 转换为 HTML/文本的样式表语言(新窗口打开)
</desc>
</tech>
</catalog>
进阶:带封面图片的图书目录
飞翔科技内部图书馆系统。每本书的描述是一个 XLink,点击可查看封面图(embed 模式)。
library.xml :
<?xml version="1.0" encoding="UTF-8"?>
<bookstore xmlns:xlink="http://www.w3.org/1999/xlink">
<book title="XML入门指南">
<description
xlink:type="simple"
xlink:href="covers/xml-guide.png"
xlink:show="embed"
xlink:actuate="onLoad">
大翔撰写的最新 XML 教程,涵盖从基础语法到 XSLT 的完整内容。
</description>
</book>
<book title="微服务设计">
<description
xlink:type="simple"
xlink:href="covers/microservice.png"
xlink:show="embed"
xlink:actuate="onLoad">
白歌基于公司实际项目经验总结的微服务架构指南。
</description>
</book>
</bookstore>
结果 :当 XML 被浏览器解析时,封面图片自动嵌入(show="embed")并随页面加载(actuate="onLoad")——类似 HTML 中 <img src="..."> 的效果。
XPointer:精确定位
dogs-breed.xml (目标文档):
<?xml version="1.0"?>
<dogbreeds>
<dog breed="Rottweiler" id="Rottweiler">
<picture url="rottweiler.jpg"/>
<history>罗威纳犬的祖先可能是罗马牧牛犬...</history>
<temperament>自信、勇敢、警觉,是受欢迎的保护犬...</temperament>
</dog>
<dog breed="FCRetriever" id="FCRetriever">
<picture url="fcretriever.jpg"/>
<history>平毛寻回犬是最早用于帮助渔民的犬种之一...</history>
</dog>
</dogbreeds>
mydogs.xml (链接源,使用 XPointer 精确指向):
<?xml version="1.0"?>
<mydogs xmlns:xlink="http://www.w3.org/1999/xlink">
<mydog>
<name>安东</name>
<description>安东是我最喜欢的狗,曾获得多项比赛冠军。</description>
<fact
xlink:type="simple"
xlink:href="dogbreeds.xml#Rottweiler">
罗威纳犬详细信息
</fact>
</mydog>
<mydog>
<name>布鲁托</name>
<description>布鲁托是世界上最温柔的狗。</description>
<fact
xlink:type="simple"
xlink:href="dogbreeds.xml#FCRetriever">
平毛寻回犬详细信息
</fact>
</mydog>
</mydogs>
点击"安东"的 fact 链接,直接跳到 dogbreeds.xml 中 id="Rottweiler" 所在的精确位置。
操作结果
| 场景 | 技术 | 效果 |
|---|---|---|
| 文档目录互链 | simple XLink | 点击跳转到其他 XML 文档 |
| 嵌入封面图 | simple + show="embed" | 图片自动嵌入文档 |
| 精确定位 | XPointer #id | 链接到目标文档的特定元素 |
| 多对多关系 | extended XLink | 链接定义可集中管理 |
易错场景
忘记声明 XLink 命名空间
<!-- 错误:未声明 xmlns:xlink -->
<desc xlink:type="simple" xlink:href="doc.xml">详情</desc>
<!-- 浏览器/解析器不识别 xlink:type -->
必须在根元素(或使用元素)上声明:xmlns:xlink="http://www.w3.org/1999/xlink"。
混淆 show 值的行为
xlink:show="new" <!-- 新窗口 -->
xlink:show="replace" <!-- 当前窗口(默认) -->
xlink:show="embed" <!-- 嵌入当前文档 -->
embed 和 replace 完全不同的行为——前者不离开当前页面,后者替换整个文档。
XPointer 目标文档缺少 id 属性
<!-- 目标文档中元素没有 id 属性 -->
<dog breed="Rottweiler"> <!-- 没有 id -->
XPointer 的简写形式 #Rottweiler 依赖目标文档中的 id 属性。如果目标元素没有 id,必须用完整的 xpointer() 表达式。
面试考点
| 考点 | 参考答案要点 |
|---|---|
| XLink 和 HTML 链接有什么区别? | HTML 有预定义的 <a> 标签;XML 无预定义标签,XLink 通过命名空间属性将任意元素标记为链接。XLink 还支持多向链接和外部链接定义 |
| simple 和 extended 链接的区别? | simple:一对一跳转(类似 <a>);extended:多对多关系,可定义多个定位器(locator)和遍历弧(arc),链接定义可与内容分离 |
| XPointer 的作用? | 在 XLink 中精确定位目标文档的某个部分(元素、文本范围),而非整个文档 |
| XLink 的浏览器支持状况? | 主流浏览器不支持 XML 文档中的 XLink,但支持 SVG 中的 XLink。XLink 更多用于 XML 编辑器和内容管理系统等专用工具 |