什麼是XPath
XPath(可擴展路徑)是給XSL轉換[XSLT]和XPointer[XPointer]的共享功能提供一個共用的句法及語義的結果。XPath的主要的目是用於對XML文檔元件尋址。在支持這個主要目的的同時,它也為字符串,數字和布爾的操作提供了基本手段。XPath使用簡明的、非XML句法以便於在URIs和XML屬性值以內使用XPath,XPath對XML文檔的抽象的、邏輯的結構而非它的表面句法進行操作,XPath的名字源於它在URL中用作對XML文檔的層次的結構進行導航一個路徑標志。
除了用做尋址外,XPath也被設計成以便它有能被用於匹配的一個自然的子集(測試一個節點是否匹配一個模式);XSLT中描述了XPath在這方面的使用。
XPath將一個XML文檔建模成為一棵節點樹,有不同類型的節點,包括元素節點,屬性節點和正文節點。XPath定義了一種方法來計算每類的節點的字串值。一些節點的類型也有名字。XPath充分支持XML命名空間[XMLNames]。這樣,節點的名字被建模成由一個局城部分和可能為空的命名空間URI組成的對;這被稱為擴展名。
XPath返回的類型
1:節點集合(無序的、無重復的節點集合)
2:布爾(真或假)
3:數字(一個浮點數字)
4:字符串(UCS字符的順序)
地址路徑
地址路徑是Xpath用於定位的一條語句,基本的語法如下:
/選擇XML文檔的根結點
/*選擇根結點的所有子節點,
*匹配任意子節點
/x選擇根結點的所有x元素
//book選擇根結點的所有後代節點中的book元素
//@id選擇含有id屬性的子節點
para[1]選擇上下文節點的第一個para孩子
//vendor[@id='id1_2']/book選擇符合“屬性id='id1_2'”的所有book元素
/bib/vendor/book[year>2002]選擇符合“元素year>'2002'”的所有book元素
text()選擇上下文節點的所有的正文節點孩子
@name選擇上下文節點的name屬性
@*選擇上下文節點的所有的屬性
*/para選擇上下文節點的所有的para孫子
/doc/chapter[5]/section[2]選擇doc的第五個chapter的第二個section
.//para選擇上下文節點的para元素子孫
para[@type="warning"]選擇的上下文節點的所有的有屬性type且值為warning的para孩子
chapter[title="Introduction"]選擇上下文節點的chapter孩子如果它有一個或多個title孩子且字串值為Introduction
employee[@secretaryand@assistant]選擇上下文節點的所有既有secretary屬性又有assistant屬性的employee孩子
chpater[title]選擇的上下文節點中有一個或一個以上title孩子的chpater孩子
1:child是缺省軸。例如,地址路徑div/para是child:iv/child::para的縮寫。
2:屬性也有縮寫形式:attribute::能被縮寫成@。例如,地址路徑para[@type="warning"]為child::para[attribute::type="warning"]的縮寫,也就是選擇有type屬性且屬性值為warning的para孩子。
3://是/descendant-or-self::node()/的縮寫。例如,//para是/descendant-or-self::node()/child::para的縮寫,因此選擇文檔中所有的para元素(即使para元素是文檔元素,也會被//para所選擇,因為文檔元素是根節點的孩子);div//para是div/descendant-or-self::node()/child::para的縮寫,因此將選擇div孩子的所有para子孫
核心函數庫
節點集合函數
last()返回一個數字,該數字等於從表達式求值上下文中的上下文大小
position()函數返回一個數字,該數字等於從表達式求值上下文中的上下文位置
count(node-set)函數返回在參數node-set中節點的個數
id(object)通過元素的唯一的ID選擇他們
local-name(node-set?)返回一個節點的擴展名的局域部分
namespace-uri(node-set?)返回依照文檔順序參數節點集合中的第一個節點的擴展名的命名空間URI,除了元素節點和屬性節點外函數namespace-uri返回的字符串將為空
name(node-set?)返回一個字符串,字符串包含一個QName,它代表依照文檔順序參數節點集合中的第一個節點的擴展名,除了元素節點和屬性節點外,由name函數返回的字符串將與local-name函數返回的字符串一樣
字符串函數
string(object?)函數將對象轉換成字符.
concat(string,string,string*)函數返回它的參數的聯結
starts-with(string,string)如果第一個字符串參數以第二個字符串參數起頭,starts-with函數返回真,否則,返回假
contains(string,string)如果第一個字符串參數包含第二個字符串參數,contains函數返回真,否則,返回假
substring-before(string,string)函數返回第一個字符串參數在第二個參數首次出現之前的子字符串,或者,如果第一個字符串參數不包含第二個字符串參數則返回空字符串。例如,substring-before("1999/04/01","/")返回1999
substring-before(string,string)函數返回第一個字符串參數在第二個參數首次出現之前的子字符串,或者,如果第一個字符串參數不包含第二個字符串參數則返回空字符串。例如,substring-before("1999/04/01","/")返回1999
substring(string,number,number?)函數返回第一個字符串參數從第二個參數所指定的位置開始,以第三個參數為長度的子字符串。例如,substring("12345",2,3)返回"234"。如果沒有第三個參數,則返回從第二個參數所指定的位置開始直到結束。例如,substring("12345",2)返回"2345"
string-length(string?)返回字符串中字符的個數
normalize-space(string?)函數返回空白符規范化後的參數字符串,該規范化是清除領頭及結尾的空白字以及用一個空白符替換連續的空白符
translate(string,string,string)函數返回第一個參數的字符串,其中有在第二個參數中出現的字符都被在第三個參數中相對應位置的字符所替換。例如,translate("bar","abc","ABC")返回字符串BAr。如果,第二個參數裡的字符在第三個參數的相對應位置沒有字符(因為第二個參數裡的字符串比第三個參數的字符串長),那麼,第一個參數裡的那個字符將被移去。例如,translate("--aaa--","abc-","ABC")返回"AAA"。如果在第二個參數裡的字符出現超過一次,那麼,第一次的出現決定替換的字符。如果第三個參數裡的字符串比第二個參數的字符串長,那麼,多余的字符將被忽略
布爾函數
boolean(object)
not(boolean)
true()
false()
lang(string)
數字函數
number(object?)函數參數依下列各項轉換成數字
sum(node-set)對於在參數節點集合的每個節點,sum函數返回節點字串值轉換成數字後的和
floor(number)函數返回不大於參數的整數的最大數(最接近於正無窮大)
ceiling(number)函數返回不小於參數的整數的最小數(最接近於負無窮大)
round(number)函數返回最接近於參數的整數。如果有兩個這樣的數字,那麼,返回最接近於正無窮大的那個。如果參數是NaN,那麼返回NaN。如果參數是正無窮大,那麼返回正無窮大。如果參數是負無窮大,那麼返回負無窮大。如果參數是正零,那麼返回正零。如果參數是負零,那麼返回負零。如果參數小於零,但大於或等於-0.5,那麼返回負零。
參照規范
XMLSeeSeehttp://www.w3.org/TR/1998/REC-XML-19980210
XMLNameshttp://www.w3.org/TR/REC-XML-names
XSLTSeehttp://www.w3.org/TR/xslt
部分參照XML路徑語言(XPath)版本1.0