XLink和XPointer技术
XLink的概念
HTML链接
- 跳转页面
<a href="www.baidu.com">这是一个链接</a>
- 页内定位
<a href="#course">点击我去course</a>
HTML链接缺点
- HTML链接只允许一个方向浏览
- 不能精确定位外部资源内部元素的位置(明明可以??
<a href="www.baidu.com#course">链接到百度的course</a>
- HTML链接只链接两个资源(上面提到的两个
谁说的???明明还可以发邮箱
<a href="mailto:youemail@mail.com?subject=邮件标题&body=邮件内容">告诉我们</a>
XLink概述
- 在2001年,XLink被确定为W3C推荐标准
- 浏览器只在最小限度支持XLink和XPointer
- XLink定义了一个文档如何链接到另一个文档
- XML对HTML链接功能加以扩展,支持更复杂的链接
XLink例子
<?xml version="1.0" ?>
<homepages xmlns:xlink="http://www.w3.org/1999/xlink">
<homepage
xlink:type="simple"
xlink:href="www.baidu.com">
百度
</homepage>
</homepages>
注意:必须明确xlink的命名空间即http://www.w3.org/1999/xlink
XLink属性
属性 | 值 | 描述 |
---|---|---|
xlink:href | URL | 要链接的URL |
xlink:actuate | onLoad onRequest other | 定义何时读取和显示被链接的资源 |
xlink:show | embed new replace | 在何处打开链接,默认是 replace 即替换 |
xlink:type | simple extended … | 链接的类型 |
xlink:role | 字符串 | 描述链接的功能 |
xlink:title | 字符串 | 向用户描述链接的相关信息 |
Simple Link
设计目的是设计出接近HTML的链接功能
- 用DTD来设置一个Simple Link
<!ELEMENT mylink (#PCDATA)>
<!ATTLIST mylink
xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"
xlink:type CDATA #FIXED "simple"
xlink:href CDATA #REQUIRED
xlink:show (embed | replace | new) "embed"
>
在xml中就可以直接用
<mylink xlink:href="www.baidu.com">
设计一个简单的链接
</mylink>
图像嵌入链接
在html中可以使用
<img src="xxx.jpg" />
访问一个图像
如何利用XLink实现图像链接?
<mylink xlink:href="xxx.jpg">
跳转到某网页
</mylink>
扩展链接
扩展链接是一个联合任意个数目的资源的链接,资源可能是远程和本地的任何组合
利用 xlink:type=extended
可以定义扩展链接
他的子元素的xlink可以是
-
Locator
-
arc
-
resource
-
title
这里的元素可以是用xlink:type
表示的
<book xmlns:xlink="http://www.w3.org/1999/xlink">
<summary
xlink:type="resource"
xlink:href="intro.xml"
xlin:title="book summary"
>
xxx
</summary>
<author
xlink:type="locator"
xlink:href="http://xxx.com/author.xml"
xlink:title="author info"
/>
</book>
title
标题元素:可以作为 extended, locator, resource, arc
的子元素出现
形式为 xlink:type="title"
例:使用title元素解决国际化和本地化问题。
<name xlink:type=”title” xml:lang=”en”>Peter</name>
<name xlink:type=”title” xml:lang=”fr”>Pierre</name>
<name xlink:type=”title” xml:lang=”sp”>Pedro</name>
locator
这个元素主要是链接用的,定义网络上的资源。也可以是本地的资源
<locator
xlink:type="locator"
xlink:href="www.baidu.com"
xlink:role=""
xlink:title="去百度一下"
xlink:label="hhhh"
>
</locator>
resource
这个元素主要是用于定义本地资源
<resource
xlink:type="resource"
xlink:href="./index.xml"
xlink:role=""
xlink:title="资源"
xlink:label=""
>
</resource>
arc
用于表示扩展xml链接资源之间的链接关系
<arc
xlink:type="arc"
xlink:from="A"
xlink:to="B"
xlink:acturate="onRequest"
xlink:title="next View"
xlink:arcrole=""
>
</arc>
感觉没什么用
XPath
还记得之前介绍的一个表格吗
- bookstore/book 代表bookstore元素下面的book子元素
其实这就是XPath的语法
上面的写法是一种简写形式
定位阶
child::para[postion()=last()]
这个相当于之前的
/para[position()=last()];
轴
- child => /
- descendant => //
- self => .
- parent => …
- attribute => @
- ancestor
示例
/mydoc//part-nbr
选择所有元素类型为mydoc
下面的所有 part-nbr
其实就是 child::mydoc/descendant::part-nbr
节点测试
-
node() 用于任意类型的节点测试
-
text() 测试文本节点
-
element() 测试元素节点
-
attribute() 测试任意属性节点
-
comment()用于选取注释节点
-
processing-instruction()所有处理指令节点
还记得处理指令是什么吗
<? xxx ?>
谓词
语法是 []
例如 child::item[postion() = 3]
选择item子元素中第三个item元素
可以简写为 child:item[3
]`
还可以进一步简写为 item[3]
语法 | 简写语法 | 作用 |
---|---|---|
child:shirt | shirt | 筛选上下文中所有shirt子元素 |
child:* | * | 筛选上下文中虽有子元素 |
child:text() | text() | 筛选上下文中所有文本节点 |
Attribute::currency | @currency | 筛选上下文结点的currency属性 |
/child::clothes/child::shirt [fn:position()=5]/child::name[fn:position]=2 | /child/shirt[5]/name[2] | … |
XPath运算符和函数
运算符
and, +, -, *, div, mod, or等
- 数值比较 eq, ne, lt, le, gt, ge
- 一般 =, !=, <, <=, >, >=
- 节点比较: is, <<, >>
函数
- count() 统计个数
- number() 将文本转化为数字
- substring() 截取字符串
1. => score[math lt 60]
2. => shirt/name=“金利来”
3. => book[price=“23.9”] is book[name=“操作系统”]
感觉这个也没什么用
XPointer
- XPointer的机制用于指向XML文档的内部结构
- 与XLink不同,文档或资源由XLink标识,文档内特定部分由XPointer标识
XPointer其实就是URL后面#的部分
例如
http://www .mysite.com/data.Xml#xpointer(expression)
可以用xpointer(xxx)来表示定位到哪个地方,xxx是一个XPath
例如 xpointer(/booklist/book[1])
本例指向第一个book元素,该元素是根元素booklist的一个子元素
通过类型ID属性标识元素
http://www .mysite.com/books.xml#xpointer(id('fiction'))
可以简化为
http://www .mysite.com/books.xml#fiction
子序列
#/1/3/2
代表第一个根元素的第三个子元素的第二个子元素
element()模式
这种模式下可以不用写 xpointer
element(intro) => id为intro的元素
element(intro/3/1) => ID为intro的元素的第三个子元素的第一个子元素
element(/1/2)根元素的第二个子元素
=> xpointer(/*[1]/*[2])
=> xpointer(/*[position()=1]/*[position()=2])
xmlns()
只是预定义一些命名空间而已
xmlns(c=http://example.org/customer) xmlns(p=http://example.org/personal-info)
xpointer(/c:customer/p:name)
XBase
定义一些相对路径
例如
<doc xml:base="https://www.baidu.com/today/">
<link xlink:type="simple" xlink:href="new.xml">点击我</link>
<ol xml:base="/list/">
<li>
<link xlink:type="simple" xlink:href="item1.xml"></link>
</li>
<li>
<link xlink:type="simple" xlink:href="item2.xml" xml:base="https://www.baidu.com">点击我</link>
</li>
</ol>
</doc>
上面的两个地址实际上会被解析成
new.xml => https://www.baidu.com/today/new.xml
item1.xml => https://www.baidu.com/list/item1.xml
item2.xml => https://www.baidu.com/item2.xml
第二种体现了继承性 (注意,xml:base
只继承host部分
第三种体现了覆盖性 (元素自己有就用元素本身的