📄 0703-0500.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0071)http://162.105.170.55/ASPs/GetLearningArticleTemp.asp?section=0703-0500 -->
<HTML><HEAD><TITLE>XML中国论坛 - 初学进阶 - 7.3.5 XPointer扩展</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>TABLE {
FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"
}
.pt9 {
FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"
}
.pt10 {
FONT-WEIGHT: 700; FONT-SIZE: 10pt; LINE-HEIGHT: 18pt; FONT-FAMILY: "宋体"
}
.TempOutline {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; COLOR: #666666; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.TempOutline1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; COLOR: #666666; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.Outline {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.Outline1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.Outline11 {
FONT-SIZE: 9pt; MARGIN-LEFT: 38pt; TEXT-INDENT: -50pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage0 {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage11 {
FONT-SIZE: 9pt; MARGIN-LEFT: 38pt; TEXT-INDENT: -50pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage111 {
FONT-SIZE: 9pt; MARGIN-LEFT: 51pt; TEXT-INDENT: -64pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
</STYLE>
<META content="Microsoft FrontPage 5.0" name=GENERATOR></HEAD>
<BODY vLink=#000000 aLink=#000000 link=#000000 leftMargin=0 topMargin=0
onload=""><!-- 以下为主体内容 -->
<div align="center">
<center>
<TABLE width="100%" border=0 style="border-collapse: collapse" bordercolor="#111111" cellpadding="0" cellspacing="0">
<TBODY>
<TR vAlign=top>
<TD width=57 rowSpan=2></TD>
<TD vAlign=center width="527">
<p align="center"><IMG height=33
src="image/title_learner.gif" width=226></TD>
<TD width=42 rowSpan=2></TD>
</TR>
<TR vAlign=top>
<TD width="527" ><!-- 正文内容 -->
<DIV class=pt10><B>7.3.5 XPointer扩展</B></DIV>
<DIV></DIV><BR>
<DIV class=pt9>
<P>前面介绍的定位方式来源于XPath,它们同时适用于XPath和XPointer,但是XPointer对XPath进行了扩展。其扩展主要包括:
<UL>
<LI>增加了函数here() 和origin()用于进行位置定位;
<LI>将XPath的节点(node)扩展为位置(location),位置可以是节点、点和区域;
<LI>增加了区域表达式,用于生成区域;
<LI>增加函数start-point() 和end-point(),用于定位节点和区域的起始点和结束点;
<LI>增加函数string-range(),用于生成字符串;
<LI>增加谓词函数unique(),用于测试XPointer表达式是否只返回一个位置,而不是多个位置或没有返回位置。 </LI></UL>
<P><STRONG>定位函数</STRONG></P>
<P>前面提到,绝对位置的定位可以用根节点,或者指定了ID属性值的元素,对应的函数为root()和id(),其中root()可以简写为"/"。除了这两个函数外,XPointer还提供两个函数定位位置,它们是here()和origin()。</P>
<P>here()函数返回当前元素,即包含当前XPointer的元素,经常用于构造链表。下例表示一本名为《XML初学进阶》的书,它包括十章,每一章包括指向前一章和后一章的链接。为简短起见,省略了文件的DTD。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><?xml version="1.0" encoding="gb2312"
?><BR><BOOK xmlns:xlink =
"http://www.w3.org/1999/xlink"<BR>
name = "XML初学进阶"<BR> author =
"XML中国论坛"><BR> <CHAPTER><BR> 第一章
XML基本概念<BR> <LINK xlink:type = "simple"
<BR>
xlink:href = "here()/following::CHAPTER
[1]"><BR> 下一章</LINK><BR>
</CHAPTER><BR> <CHAPTER><BR> 第二章
XML基本语法<BR> <LINK xlink:type = "simple"
<BR>
xlink:href = "here()/preceding::CHAPTER
[1]"><BR>
上一章</LINK><BR> <LINK xlink:type =
"simple"<BR>
xlink:href = "here()/following::CHAPTER
[1]"><BR> 下一章</LINK><BR>
</CHAPTER><BR> ……<BR>
<CHAPTER><BR> 第十章
XML应用<BR> <LINK xlink:type =
"simple"<BR>
xlink:href="here()/preceding::CHAPTER [1]"><BR>
上一章</LINK><BR>
</CHAPTER><BR></BOOK></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>关于origin()函数的含义有一些混淆的地方,按照XPointer的当前版本的规范,origin()函数和here()函数基本相同,但origin()函数用于外联链接(out-of-line),表示资源文件中链接激活处的元素。但是由于XLink的最新版本规范中已经没有了外联链接的概念,因此XPointer中的解释失去了意义,也许可以将外联链接理解为链接库。出现这个问题的原因是XPointer和XLink的规范不同步,XPointer的候选标准推出比XLink候选标准推出早了约一个月,但与XLink相关的部分还按照XLink规范的老版本。希望在两个规范推出正式标准时不会出现这个问题。</P>
<P><STRONG>点</STRONG></P>
<P>前面介绍的位置步都返回XML中的节点,比如:元素、注释、处理指令等。它们都是XML中的结构数据,但是有时需要定位的不是一个XML结构,而是XML结构数据中的某一部分。比如:在CDATA数据中定位部分数据,或者在日期中定位月份时,就必须用到点(point)进行定位。XPointer中的点表示XML文件中节点和字符前后的位置。</P>
<P>如果点的包含节点是可以包含子节点的元素或根节点,则该点称为节点点(node-point)。此时索引是按照节点进行的,索引号0表示所有子节点之前的位置,索引号n表示第n个子节点之后的位置。如果点的包含节点不能包含子节点,此时的点称为字符点(character-point),此时索引是按照字符进行的,索引号0表示所有字符之前的位置,索引号n表示第n个子字符之后的位置。例如:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD
width="100%">//descendant::sepc[position()=1]/point()[position()=0]</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>表示文件中第一个sepc元素的第一个子节点前的位置。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD
width="100%">//descendant::sepc[position()=1]/child::text()/point()[position()=3]</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>表示文件中第一个sepc元素的文本中第3个字符后的位置。</P>
<P><STRONG>区域</STRONG></P>
<P>区域是由起始点(start point)和结束点(end
point)定义的一个连续块,它可以包括起始点和结束点之间的任何XML结构,比如节点、字符串或节点片断等。起始点和结束点相同的区域是空区域。区域从一个点开始,到另一个点结束。每个点是由位置路径指定,如果起始点的位置路径返回位置集合,则起始点为位置集合的第一个点。如果结束点的位置路径返回位置集合,则结束点为位置集合的最后一个点。</P>
<P>区域的形式为xpointer(start-point/range-to(end-point)),其中start-point是一个位置路径,表示区域的起始点,end-point是另一个位置路径,表示区域的结束点,range-to()是一个函数,其参数是位置路径,表示整个位置路径的计算结果是一个区域。例如:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD
width="100%">xpointer(//descendant::sepc[position()=1]/child::text()/point()[position()=0]/range-to
(//descendant::sepc[position()=1]/child::text()/point()[position()=5]))</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>表示文件中第一个sepc元素的文本中的前5个字符组成的字符串。</P>
<P>XPointer提供了start-point()
和end-point()函数,用于计算区域或位置集合的起始点和结束点。另外,还提供了两个区域函数range()和range-inside(),它们都以位置集合作为参数,返回结果也是位置集合。range()函数将位置集合中的每一个位置转换为一个覆盖该位置的最小区域,然后构成一个新的位置集合。range-inside()函数将位置集合中的每一个位置转换为一个覆盖该位置内容的最小区域,然后构成一个新的位置集合。对于位置集合参数的每一个位置x,如果x是一个区域,则将x直接加入结果集合,否则x将被视为新区域起始点和结束点的包含节点,将起始点和结束点之间的区域加入结果集合。比如对一个元素节点,其起始点在元素的第一个子节点之前,结束点在所有的子节点之后,因此最后的计算结果是该元素的内容。</P>
<P><STRONG>字符串匹配</STRONG></P>
<P>严格来讲,字符串匹配的返回结果是一个字符串区域,因此应该属于区域的范畴。但是由于字符串匹配比较重要和常用,因此将其列出单独介绍。</P>
<P>字符串匹配是通过string-range()函数实现。其基本形式是:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD
width="100%">string-range(location-set,substring,index,length)</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>其中index和length是可选的。string-range()函数在指定的位置集合(由参数表中的location-set指定)中匹配指定的字符串(由参数表中的substring指定),index用于指定返回字符串区域的第一个字符的位置,该位置是相对于匹配位置的起始点,缺省值为1,表示返回字符串区域从匹配的第一个字符开始。length表示返回字符串的长度,缺省为查找字符串的长度。string-range()函数的返回结果是所有匹配字符串区域构成的集合。substring可以是空串,表示上下文节点的文本内容。例如:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD
width="100%">xpointer(string-range(/,"",1,8)[position()=1])</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>表示文件中的文本数据的前8个字符。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD
width="100%">xpointer(string-range(//sepc[position()=1],"date",2,2)</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>表示选择在文件中第一个sepc元素内出现的所有"date"字符串中的"at"子串。</P>
<P>最后提醒几点:字符串匹配是大小写敏感的;文件中的连续空白字符被视为一个空白字符处理;字符串匹配不考虑标记字符。<BR></P></DIV>
<P></P>
<P></P></TD></TR></TBODY></TABLE>
</center>
</div>
<P></P>
<P>
<P></P></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -