XPointerXML设计及应用.docx
《XPointerXML设计及应用.docx》由会员分享,可在线阅读,更多相关《XPointerXML设计及应用.docx(38页珍藏版)》请在冰豆网上搜索。
XPointerXML设计及应用
二、XPointer
XPointer=XMLPointerLanguage=XML指针语言
1.概述
XPointer是一种基于XPath的可扩展片段标识符语言(fragmentidentifierlanguages),可以对XML文档内的节点(node)、点(point)、范围(range)和串(string)等资源片段进行定位,用作具有text/xml、application/xml、text/xml-external-parsed-entity或application/xml-external-parsed-entity等因特网媒体类型的任何资源的片段标识符(fragmentidentifiers)。
XPointer用作URI引用的片段标识符(fragmentidentifiers),可以用于XLink、XInclude、RDF(ResourceDescriptionFramework资源描述框架)和SOAP(SimpleObjectAccessProtocol简单对象访问协议)等XML处理应用。
如XLink=URI+XPointer,如URI#方案名(方案数据)…,具体如URI#xpointer(XPath的定位路径表达式),例如:
xpointer(//d:
*[1])。
XPointer的作用与格式都与HTML的锚(anchor)相似:
●HTML锚的格式为:
HTML文档#锚名,例如:
a.html#chapter1
●而XPointer的格式一般为:
⏹简写形式:
XML文档#标识符值,例如abc.xml#chapter1
⏹基于方案形式:
XML文档#方案(…),例如abc.xml#xpointer(id(‘chapter1’))
在XML应用中,XPointer一般不被单独使用,而是被XLink和XInclude等其它XML标准引用。
1)标准
开始时XPointer被设计成一个单一标准:
XMLPointerLanguage(XPointer)Version1.0,CR:
2001.9.11。
但是,该1.0版推出候选推荐标准后就被终止,没有完成标准化进程(达到最后的推荐标准阶段)。
后来XPointer被分解成框架(Framework)、元素方案(element()Scheme)、名域方案(xmlns()Scheme)和指针方案(xpointer()Scheme)四个部分,其中的前三个已经在2003年3月23日成为推荐标准,而最后一个现在仍然处在草案阶段:
●框架(REC2003.3.23):
XPointerFramework--W3CRecommendation25March2003
●元素方案(REC2003.3.23):
XPointerelement()Scheme--W3CRecommendation25March2003
●名域方案(REC2003.3.23):
XPointerxmlns()Scheme--W3CRecommendation25March2003
●指针方案(WD2002.12.19):
XPointerxpointer()Scheme--W3CWorkingDraft19December2002
2)功能
XPointer:
●Framework框架——片段定位的基础
●element()Scheme元素方案——定位元素
●xmlns()Scheme名域方案——解释指针中的名域前缀
●xpointer()Scheme指针方案——提供串(string)、点(point)、两点之间的范围(range)等部分(portions)定位的高级功能
3)XPointer对XPath的扩展
●用于URI引用以定位资源片段(subresource)
●像定位整个节点(node)一样地定位点(point)和范围(range)
●通过串匹配定位文本信息
4)术语
●指针pointer=string串
●方案scheme=具有名称,且被一个规范所定义的专门指针数据
2.框架
XPointer的框架(Framework)标准定义了XML指针语言(XPointer)的框架——一个XML定位的可扩展系统,是其它具体XPointer方案规范(specifications)的基础。
1)语法
下面是XPointer框架的语法(生成式规则):
XPointerFrameworkSyntax
[1]Pointer:
:
=Shorthand|SchemeBased
[2]Shorthand:
:
=NCName
[3]SchemeBased:
:
=PointerPart(S?
PointerPart)*
[4]PointerPart:
:
=SchemeName'('SchemeData')'
[5]SchemeName:
:
=QName
[6]SchemeData:
:
=EscapedData*
[7]EscapedData:
:
=NormalChar|'^('|'^)'|'^^'|'('SchemeData')'
[8]NormalChar:
:
=UnicodeChar-[()^]
[9]UnicodeChar:
:
=[#x0-#x10FFFF]
其中的S在XML推荐标准中定义,NCName和QName在XMLNamespace标准中定义。
可见,XPointer中的
指针=简写指针|基于方案的指针=本地名|方案名(方案数据)…
2)简写指针
[2]Shorthand:
:
=NCName
简写指针(shorthandpointer)以前叫裸名(barename),由单独的一个无冒号名(NCName)构成,它至多标识资源信息集中的一个元素,尤其是文档顺序中匹配该标识名的第一个元素。
指针的简写形式依赖于标识符ID机制——应用程序需要靠ID属性或ID元素的值来确定元素。
使用方法:
URI#标识符值。
(1)DTD定义的ID属性
简写指针中的裸名可以是由DTD定义的ID属性的值,例如:
●a.xml:
DOCTYPEA[
ELEMENTA(B+)>
ELEMENTBEMPTY>
ATTLISTBidID#REQUIRED>
]>
●XPointer:
a.xml#b1指向a.xml文档的第一个B元素,是基于指针方案的a.xml#xpointer(id(‘b1’))的简写,也与基于元素方案的a.xml#element(/1/1)等价。
(2)Schema确定的ID属性
简写指针中的裸名也可以是由Schema定义的ID属性的值,例如:
●schema.xsd:
schemaxmlns:
xsd="http:
//www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"version="1.0">
elementname="A">
complexType>
sequence>
elementname="B"maxOccurs="unbounded">
complexType>
attributename="id"type="xsd:
ID"/>
complexType>
element>
sequence>
complexType>
element>
schema>
●a.xml:
noNamespaceSchemaLocation="schema.xsd"
xmlns=""
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance">
●XPointer:
同上例,a.xml#b1指向a.xml文档的第一个B元素。
(3)Schema确定的ID元素
简写指针中的裸名还可以是由Schema定义的ID元素的值,例如:
●schema:
将上例中的红色行改为:
sequence>
elementname="id"type="xsd:
ID"/>
sequence>
其余的不变。
●a.xml:
xsi:
noNamespaceSchemaLocation="schema.xsd"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance">
b1
b2
●XPointer:
同上例,a.xml#b1指向a.xml文档的第一个B元素。
(4)外部确定的ID
上一个表示元素标识符的串,其值由采用本规范范围之外的机制的应用来确定。
例如RelaxNG:
●RelaxNGschema:
//relaxng.org/ns/structure/1.0">
//relaxng.org/ns/compatibility/datatypes/1.0"
type="ID"/>
●a.xml:
●XPointer:
同上例,a.xml#b1指向a.xml文档的第一个B元素。
3)基于方案的指针
[3]SchemeBased:
:
=PointerPart(S?
PointerPart)*
[4]PointerPart:
:
=SchemeName'('SchemeData')'
[5]SchemeName:
:
=QName
基于方案的指针(scheme-basedpointer)由若干用白空分隔的指针部分(pointerparts)组成,每个部分有一个方案名和用圆括号括起来的方案数据。
即:
URI#方案名1(方案数据1)方案名2(方案数据2)…方案名n(方案数据n)
例如:
#xpointer(id('boy-blue')/horn[1])element(boy-blue/3)
注意:
●若提供了多个指针部分,则按从左至右的顺序来处理,处理器跳过不支持的方案和不能识别出任何资源片段(subresources)的指针部分,直到第一个能识别出若干资源片段的指针部分后终止,并返回该资源片段。
若所有的指针部分都不能识别出任何资源片段,则报错
●方案数据中的圆括号必须成对匹配,对不是配对的圆括号必须使用^转义字符
●元素方案的方案名element和括号()都可以省去,只用方案的数据即可
4)名域绑定上下文
为了解释方案名、元素名、属性名和出现在指针部分的其它限定名的前缀,方案规范可以定义绑定XML命名空间前缀到名域名的方法。
例如:
#xmlns(img=http:
//example.org/image)img:
rect(10,10,50,50)
注意:
●xml前缀只能被绑定于名域名http:
//www.w3.org/XML/1998/namespace
●名域名http:
//www.w3.org/XML/1998/namespace也只能被绑定给xml前缀
●xmlns不能被绑定到一个名域名
●名域名http:
//www.w3.org/2000/xmlns/也不能被绑定给任何前缀
●前缀xml不论大小写(如XML、xML、XlM、xlM、XMl等)都被保留(reserved)
5)转移字符
[6]SchemeData:
:
=EscapedData*
[7]EscapedData:
:
=NormalChar|'^('|'^)'|'^^'|'('SchemeData')'
[8]NormalChar:
:
=UnicodeChar-[()^]
[9]UnicodeChar:
:
=[#x0-#x10FFFF]
方案数据中的圆括号必须成对匹配,对不配对的圆括号必须使用^转义字符:
●(^(
●)^)
●^^^
例如:
笑脸:
-):
-^)。
也可以使用十六进制编码:
%HH;,如%%25;、空格%20;、”%22;。
3.元素方案
XPointer的元素方案(element()scheme)是与XPointer框架一起使用,进行XML元素的基本寻址。
其生成式语法规则如下:
element()SchemeSyntax
[0]PointerPart:
:
=element‘(‘ElementSchemeData‘)’|ElementSchemeData
//addedbymyself
[1]ElementSchemeData:
:
=(NCNameChildSequence?
)|ChildSequence
[2]ChildSequence:
:
=('/'[1-9][0-9]*)+
即
元素方案的语法:
[0]指针部分=element(元素方案数据)|元素方案数据//本条为我自己加的
[1]元素方案数据=标识名子节点序列?
|子节点序列
[2]子节点序列=(/不以0开头的十进制数字串n)+,其值n等价于XPath的*[position()=n]
例子:
●element(intro)——ID为intro的元素
●element(intro/3/1)——ID为intro的元素节点的第三个子元素节点的第一个孙元素节点
●element(/1/2)——根节点的第一个子元素节点(即文档的根元素节点)的第二个孙元素节点,等价于xpointer(/*[1]/*[2])=xpointer(/*[position()=1]/*[position()=2])
4.XML命名空间方案
xmlns()SchemeSyntax
[0]PointerPart:
:
=xmlns‘(‘XmlnsSchemeData‘)’//addedbymyself
[1]XmlnsSchemeData:
:
=NCNameS?
'='S?
EscapedNamespaceName
[2]EscapedNamespaceName:
:
=EscapedData*
即
名域方案语法
[0]指针部分=xmlns(XML名域方案数据)//本条为我自己加的
[1]XML名域方案数据=域名前缀=转义名域名
[2]转义名域名=转义数据*//一般为URI串
即XML命名空间方案的格式为:
xmlns(前缀=URI)
一般后跟带名域前缀的指针部分,且其中的URI只能定位到文档,不能定位于资源的片段。
例如:
●#xmlns(abc=
●examp.xml#xmlns(c=http:
//example.org/customer)xmlns(p=http:
//example.org/personal-info)#xpointer(/c:
customer/p:
name)可以定位于文档:
examp.xml片段:
//example.org/customer">
//example.org/personal-info">JohnDoe
中的name元素。
5.X指针方案
XPointer的X指针方案(xpointer()Scheme)是XPointer的四个规范中唯一还没有推荐标准的规范。
这主要是因为它的内容多,格式复杂,而且与XPath的关系十分紧密,所以至今还存在一些争议。
XPointer的X指针方案是与XPointer框架一起使用,提供寻址XML文档之部分(portions)的高级功能。
1)术语
●点point——无内容或子节点的XML信息集中的一个定位(location),如相邻两节点之间、文本节点中的某一指定字符之后(来自DOM2中的位置position概念)
●范围range——位于两点之间的所有XML信息之集(也是来自DOM2规范的范围概念)
点和范围并不太适合将文档看成树结构,而更适合于将文档视作一个顺序流。
2)语法
X指针方案的生成式语法规则如下:
xpointer()SchemeSyntax
[0]PointerPart:
:
=xpointer‘(‘XpointerSchemeData‘)’//addedbymyself
[1]XpointerSchemeData:
:
=Expr//即XPath的表达式
3)对XPath的扩展
●扩展信息集——将XPath中的节点、节点类型和节点集的概念扩展到X指针方案的定位概念(包括节点、点和范围)、定位类型(即信息节点类型+点和范围)和定位集
●增加定位类型——增加了点与范围两种新的定位类型(对应于DOM2的位置与范围),它们可出现在定位集的结果中,也可对它们进行与XPath中的节点测试相似的测试
●添加求值规则——增加了建立XPath求值上下文的规则
●允许多个一级子节点——似XSLT,允许根节点有多个子节点,使得表达式可以像定位良构文档一样去定位任意外部可解析实体
●增加函数
⏹covering-range与range-inside——覆盖定位集中的定位范围
⏹string-range与range-to——采用识别某个或若干文本节点中给定文本串之位置的方法来标识范围
⏹here与origin——进行位置定位
⏹start-point与end-point——定位节点或范围的起始与结束边界
4)节点类型
NodeType
[2]NodeType:
:
='comment'|'text'|'processing-instruction'|'node'|'point'|'range'
可见XPointer在原来XPath的生成式规则[38]中就有的注释、文本、处理指令和节点这四种节点类型的基础上又加了点(point)和范围(range)两种新的节点类型。
5)文档的顺序
XML文档:
hello,bigworld.
的带定位的文档树:
例如:
●point(1.0)是p元素内的刚开始处(文本节点“hello,”之前)
●point(1.2)是em元素的末尾与下面的文本节点(它包含"world.")之间
●point(.0)根元素节点p之前
●point(1/2/1.1)中间文本节点中的字母"b"之后
6)添加的函数
XPointer在原有XPath的27个核心函数的基础上又新增加了如下8个函数:
(1)range-to函数(到…范围)
格式为:
location-setrange-to(location-set),即:
定位集range-to(定位集)
XPath中的步进规则[4]应该改为:
[4xptr]Step:
:
=AxisSpecifierNodeTestPredicate*|AbbreviatedStep|'range-to''('Expr')'Predicate*
即:
步进=轴:
:
节点测试[谓词]*|缩写步进|range-to(表达式)[谓词]*
其中最后一部分为新加的。
例如:
●xpointer(id("chap1")/range-to(id("chap2")))——从标识符值为chap1的元素的开始点到标识符值为chap2的元素的结束点之间的范围
●xpointer(descendant:
:
REVST/range-to(following:
:
REVEND[1]))——定位选择所有被修订的部分,其中descendant=后裔轴、REVST=修订开始(revisionstart)空元素、REVEND=修订结束(revisionend)空元素、following:
:
REVEND[1]=后面的第一个修订结束,即本修订部分的结束
(2)string-range函数(串范围)
格式为:
location-setstring-range(location-set,string,number?
number?
),即
定位集string-range(定位集,匹配串,首字符位置?
字符数?
)
其中:
●首字符位置——缺省为1
●字符数——缺省到匹配串尾
可见,当首字符位置和字符数都缺省时,返回的范围为整个匹配串。
例如:
●string-range(//title,"ThomasPynchon")[17]——返回指定串"ThomasPynchon"在title元素中的第17次出现所对应的范围
●string-range(//P,"ThomasPynchon",8,0)[3]——返回指定串"ThomasPynchon"在P元素中的第3次出现的第8个字符P开始处所对应的位置点,等价于
string-range(//P("ThomasPynchon")[3],"P",1,0)
●string-range(//text(),"!
",1,2)[5]——返回文档中所有文本节点中的感叹号!
的第五次出现处的感叹号!
及其随后的一个字符所对应的范围
(3)covering-range函数(覆盖范围)
格式为:
location-setcovering-range(location-set),即:
定位集covering-range(定位集)
●若入口参数为点或者范围,则返回的结果不变
●若入口参数为其它节点类型,则返回它们所对应的范围。
例如:
covering-range(元素节点)=|<元素名…>…元素名>|
(4)range-inside函数(范围内)
格式为:
location-setrange-inside(location-set),即:
定位集range-inside(定位集)
似covering-ra