以下是关于 XLink 和 XPointer 的完整中文教程,适合想要深入理解 XML 链接与定位机制的开发者。虽然现在 HTML5 的 <a> 和 <img> 已经主导了超链接领域,但 XLink/XPointer 仍是 XML 生态中非常重要(尤其是 XHTML、SVG、TEI、DocBook、SMIL 等格式)的标准,很多现代系统(如 EPUB 3、SVG、XProc 管道)仍在使用它们。
1. XLink 简介(XML Linking Language)
XLink 是 W3C 制定的 XML 链接规范(2001年成为推荐标准),主要解决 HTML <a> 标签的局限性。
核心特点
- 支持多目标链接(一个链接可以指向多个资源)
- 支持双向链接(可以显式标记起点和终点)
- 支持第三方链接(链接可以放在独立的 XML 文件中,不必嵌入源文档)
- 链接行为可编程(通过
show、actuate等属性控制) - 区分简单链接(类似 HTML a)和扩展链接(功能强大)
XLink 命名空间
xmlns:xlink="http://www.w3.org/1999/xlink"
常用 XLink 属性
| 属性 | 可能值 | 说明 |
|---|---|---|
| xlink:type | simple / extended / locator / arc / resource / title / none | 链接类型,必填 |
| xlink:href | URI | 目标资源地址(简单链接必填) |
| xlink:role | anyURI | 链接的语义角色(可自定义) |
| xlink:arcrole | anyURI | 弧(从一个资源到另一个资源的遍历)的语义角色,常用于描述关系(如“父-子”) |
| xlink:title | string | 链接的提示文字 |
| xlink:show | new / replace / embed / other / none | 打开方式(新窗口、替换当前、嵌入等) |
| xlink:actuate | onLoad / onRequest / other / none | 触发时机(加载时自动还是用户点击) |
| xlink:label | NMTOKEN | 在扩展链接中给 locator 或 resource 起名字,用于 arc 引用 |
1.1 简单链接(Simple Link)—— 等价于 HTML 的
<image xlink:type="simple"
xlink:href="photos/cat.jpg"
xlink:show="new"
xlink:actuate="onRequest"
xlink:title="可爱的小猫">
点击查看大图
</image>
等价于 HTML:
<a href="photos/cat.jpg" target="_blank" title="可爱的小猫">点击查看大图</a>
1.2 扩展链接(Extended Link)—— 真正的强大之处
可以实现多端点、第三方链接。例如创建一个“家庭关系图”链接集:
<family xlink:type="extended"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- 参与者(locator) -->
<person xlink:type="locator" xlink:href="people.xml#john" xlink:label="john" xlink:title="约翰"/>
<person xlink:type="locator" xlink:href="people.xml#mary" xlink:label="mary" xlink:title="玛丽"/>
<person xlink:type="locator" xlink:href="people.xml#tom" xlink:label="tom" xlink:title="汤姆"/>
<!-- 资源(也可以是本地资源) -->
<photo xlink:type="resource" xlink:label="wedding-photo" xlink:title="婚纱照">
<description>约翰和玛丽的婚纱照</description>
</photo>
<!-- 连接弧(arc) -->
<relation xlink:type="arc"
xlink:from="john"
xlink:to="mary"
xlink:arcrole="http://example.com/relation#spouse"
xlink:show="replace"
xlink:actuate="onRequest"/>
<relation xlink:type="arc"
xlink:from="john"
xlink:to="tom"
xlink:arcrole="http://example.com/relation#parent"
xlink:title="父亲"/>
<relation xlink:type="arc"
xlink:from="wedding-photo"
xlink:to="john"
xlink:show="embed"/>
</family>
这个链接集可以放在独立的 .xml 文件里,不影响原始文档。
2. XPointer 简介(XML Pointer Language)
XPointer 是用来在 XML 文档内部精确寻址的语言,常与 XLink 的 xlink:href 一起使用,指向文档中的某个片段。
基本语法(写在 URI 的 # 后面)
xlink:href="book.xml#xpointer(//chapter[@id='intro'])"
常用 XPointer 方案
| 方案 | 示例 | 说明 |
|---|---|---|
| xmlns() | #xmlns(svg=http://www.w3.org/2000/svg) | 声明命名空间 |
| element() | #element(/1/2/3) 或 #element(chapter1) | 按位置或 ID 定位元素 |
| xpath1() | #xpointer(/book/chapter[2]/section[1]) | 完整 XPath(XPointer 早期支持 XPath 1.0) |
| xpointer() | #xpointer(id(‘intro’)) #xpointer(//para[contains(.,’XML’)]) | 最常用方案,支持完整 XPath |
| shorthand | #intro | 简写,等价于 id(‘intro’)(如果 DTD/Schema 定义了 ID) |
| 范围 range() | #xpointer(/book/chapter[1]/para[3]/range-to(//figure[1])) | 选取一段范围 |
实际例子
<!-- 指向 ID 为 intro 的元素 -->
<chapter xlink:type="simple" xlink:href="novel.xml#intro"/>
<!-- 使用完整 XPointer 指向第二章第一个段落 -->
<section xlink:type="simple"
xlink:href="novel.xml#xpointer(//chapter[position()=2]/para[1])"/>
<!-- 多段落范围(很少有浏览器支持) -->
<note xlink:type="simple"
xlink:href="paper.xml#xpointer(id('sec3')/range-to(id('sec5')))"
xlink:title="第3-5节"/>
结合命名空间的写法(很重要!)
<go xlink:type="simple"
xlink:href="diagram.svg#xpointer(//svg:g[@id='engine']/svg:text)
xmlns(svg=http://www.w3.org/2000/svg)"/>
3. 实际应用场景
| 场景 | 使用的技术组合 |
|---|---|
| SVG 内部链接 | xlink:href=”#xpointer(…)”” 或简写 #id |
| EPUB 3 导航文档 | XLink 扩展链接 + XPointer |
| TEI(文本编码倡议) | 大量使用扩展链接和第三方链接集 |
| DocBook 文档链接 | xlink:href + XPointer |
| SMIL 多媒体同步 | XLink 简单链接 |
| XInclude + 链接 | xi:include + XLink |
4. 浏览器支持现状(2025年)
| 浏览器 | 简单 XLink | 扩展 XLink | XPointer (shorthand) | XPointer (完整) |
|---|---|---|---|---|
| Firefox | 是 | 否 | 是 | 否 |
| Chrome/Edge | 否 | 否 | 否 | 否 |
| Safari | 否 | 否 | 否 | 否 |
| SVG 查看器 | 大多数支持简单链接 | 极少支持 | 大多数支持 #id | 少数支持 |
结论:现代浏览器基本放弃了 XLink/XPointer(除了 SVG 中部分支持),但在非浏览器环境(Java/.NET XML 库、EPUB 阅读器、XML 数据库、出版系统)仍然非常活跃。
5. 快速上手示例(完整可运行)
创建一个 links.xml:
<?xml version="1.0" encoding="UTF-8"?>
<gallery xmlns:xlink="http://www.w3.org/1999/xlink">
<photo xlink:type="simple"
xlink:href="images/cat.jpg#xpointer(//image[@id='full'])"
xlink:role="http://example.com/role#fullsize"
xlink:title="大图"
xlink:show="new"
xlink:actuate="onRequest">
小猫咪
</photo>
<photo xlink:type="simple"
xlink:href="images/dog.jpg"
xlink:show="embed">
这张图直接嵌入显示
</photo>
</gallery>
6. 学习资源推荐
- W3C 官方规范
- XLink 1.1: https://www.w3.org/TR/xlink11/
- XPointer Framework: https://www.w3.org/TR/xptr-framework/
- 经典教程
- 《XML 实战》(O’Reilly)第 10 章
- W3Schools(虽然简单但有例子)
- Norman Walsh 的 XLink 教程(DocBook 作者)
- 现代应用
- EPUB 3 规范中 XLink 用法
- SVG 2.0 规范中的 XLink(注意:SVG2 正在逐步用 href 取代 xlink:href)
掌握了 XLink + XPointer,你就拥有了 XML 世界里最强大的链接与定位能力,尤其在数字出版、学术标记、图形矢量领域无可替代。
如果你想看某个具体场景的完整案例(比如用 XLink 实现类似 Wikipedia 的双向链接,或在 SVG 中做交互地图),随时告诉我!