?? 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 + -