xpath中定義了一組核心函數庫。每個(gè)函數均使用一個(gè)函數原型,該原型給出返回類(lèi)型,函數名字,以及參數的類(lèi)型。如參數類(lèi)型后跟隨一個(gè)問(wèn)號,那么該參數是可選的,否則,該參數是必需的。
xpath中函數分4類(lèi)
- 節點(diǎn)集函數
- 字符串函數
- 布爾函數
- 數字函數
這些函數在表達式和謂詞中使用。
節點(diǎn)集函數(7個(gè))
- last() 函數返回一個(gè)數字,該數字等于表達式求值上下文的上下文大?。ㄉ舷挛牡母拍顓⒖记捌?span lang="EN-US">xpath中路徑詳解),即給定上下文中的節點(diǎn)數。
- number position()
- 函數返回一個(gè)數字,該數字等于表達式求值上下文的上下文的位置,即節點(diǎn)在上下文中的當前位置。如position()=1判斷處理的節點(diǎn)是否是節點(diǎn)集合中的第一個(gè)節點(diǎn)。
- number count(node-set)
- count() 函數返回在參數節點(diǎn)集中節點(diǎn)的數目。count(//employee)
- node-set id(object)
- id() 函數根據元素的唯一標識符來(lái)選擇元素,返回一個(gè)節點(diǎn)集。元素的ID類(lèi)型屬性必須在DTD中聲明。
- string local-name(node-set?)
- 返回節點(diǎn)集合中依照文檔順序的第一個(gè)節點(diǎn)的擴展名(由節點(diǎn)的本地名和名稱(chēng)空間URI組成)的本地部分。如果參數所指定的節點(diǎn)集為空,或者第一個(gè)節點(diǎn)沒(méi)有擴 展名,則返回一個(gè)空字符串。如果參數被省略,默認參數為僅有一個(gè)上下文節點(diǎn)作為成員的節點(diǎn)集合。也就是說(shuō),如果要得到上下文節點(diǎn)擴展名的本地部分,可以不 傳遞參數調用local-name()函數。
- string namespace-uri(node-set?)
- 返回節點(diǎn)集合中依照文檔順序的第一個(gè)節點(diǎn)的擴展名的名稱(chēng)空間URI。如果參數所指定的節點(diǎn)集為空,或者第一個(gè)節點(diǎn)沒(méi)有擴展名,則返回一個(gè)空字符串。如果參 數被省略,默認參數為僅有一個(gè)上下文節點(diǎn)作為成員的節點(diǎn)集合。也就是說(shuō),如果要得到上下文節點(diǎn)擴展名的名稱(chēng)空間URI,可以不傳遞參數調用 namespace-uri()函數。
- string name(node-set?)
- 返回節點(diǎn)集合中依照文檔順序的第一個(gè)節點(diǎn)的完整限定名(名稱(chēng)空間前綴和本地部分)。如果參數所指定的節點(diǎn)集為空,或者第一個(gè)節點(diǎn)沒(méi)有擴展名,則返回一個(gè)空 字符串。如果參數被省略,默認參數為僅有一個(gè)上下文節點(diǎn)作為成員的節點(diǎn)集合。也就是說(shuō),如果要得到上下文節點(diǎn)擴展名的完整限定名,可以不傳遞參數調用 name()函數。
字符串函數(10個(gè))
- string()函數按照如下規則將對象轉換為字符串。
- 如果對象object是節點(diǎn)集合,則按照文檔順序返回第一個(gè)節點(diǎn)的字符串值。如果節點(diǎn)集為空,則返回一個(gè)空字符串。
- 數字按照如下方式轉換成字符串
- NaN(not a number 不是一個(gè)數字)轉換為字符串NaN
- 正零轉換為字符串0
- 負零轉換為字符串0
- 正無(wú)窮大轉換為Infinity
- 負無(wú)窮大轉換為-Infinity
- 如果數字為整數,則被表示為沒(méi)有小數點(diǎn)和前導零的十進(jìn)制格式的數字,如果數字為負整數則在它的前面加一個(gè)負號(-)
- 否則,數字被表示為一個(gè)包含了小數點(diǎn)(小數點(diǎn)前后至少各有一位數字)的十進(jìn)制格式的數字。如果數字是負數,則在它的前面加一個(gè)符號(-)
- 布爾值false轉換為字符串false,true轉換為true
- 除了四種基本類(lèi)型(節點(diǎn)集、布爾、數字、字符串)的對象外,其他對象按照所屬類(lèi)型的方式轉換為字符串。
- 如果參數被省略,默認參數為僅有一個(gè)上下文節點(diǎn)作為成員的節點(diǎn)集合。string()函數的并不是用于將數字轉換為字符串,以便呈現給用戶(hù)而使用的。如果要將數字格式化為字符串,可以使用xslt中的format-number()函數或<xsl:number>元素。
- string concat(string,string,string*)
- 函數將參數中各個(gè)字符串進(jìn)行連接,返回連接后的字符串。concat('n','a','m','e')=name
- boolean starts-with(string,string)
- 如果第一個(gè)參數中字符串以第二個(gè)參數中字符串開(kāi)頭則true,否則false。如果第二個(gè)參數為空字符串,則返回true
- boolean contains(string,string)
- 如果第一個(gè)參數中字符串中包含第二個(gè)參數中字符串則true,否則false。如果第二個(gè)參數為空字符串,則返回true
- string substring-before(string,string)
- 返回在第一個(gè)字符串參數中首次出現第二個(gè)字符串參數之前的子串,或第一個(gè)字符串不包含第二個(gè)字符串參數,則返回空字符串。substring-before("1900-0-0","-")=1900 如果第二個(gè)參數是空字符串,則返回空字符串。
- string substring-after(string,string)
- 返回在第一個(gè)字符串參數中首次出現第二個(gè)字符串參數之后的子串,或第一個(gè)字符串不包含第二個(gè)字符串參數,則返回空字符串。substring-after("1900-0-0","-")=0-0 如果第二個(gè)參數是空字符串,則返回第一個(gè)字符串。
- string substring(string ,number,number)
- 返回第一個(gè)字符串參數從第二個(gè)參數所指定的位置開(kāi)始,以第三個(gè)參數為長(cháng)度的子串。例如 substring("12345",2,3)="234" 如果沒(méi)指定第三個(gè)參數,則返回從第二個(gè)參數所指定的位置開(kāi)始到字符結尾的所有字符串。和程序語(yǔ)言不同的是xpath中字符串的第一個(gè)字符的位置為1,而不是0
- number string-length(string?)
- string-length()返回字符串中字符的數目。如果參數被省略,則默認是將上下文節點(diǎn)轉換為字符串,換句話(huà)說(shuō),也就是上下文節點(diǎn)的字符串值
- string normalize-space(string?)
- 此函數去除字符串前后出現的空白,以及用一個(gè)單獨的空格替換字符串中連續出現的空白字符,然后返回經(jīng)過(guò)處理后的字符串。如果參數被省略,則默認是將上下文節點(diǎn)轉換為字符串,換句話(huà)說(shuō),也就是上下文節點(diǎn)的字符串值
- string translate(string,string,string)
- 如果在第一個(gè)字符串中存在著(zhù)第二個(gè)字符串中的字符,則將該字符用第三個(gè)字符串參數中的與第二個(gè)參數中位置順序相同的字符替換,然后返回替換后的字符串。例 如 translate("bar","abc","ABC")=BAr 如果第二個(gè)參數中字符在第三個(gè)參數的對應位置沒(méi)有字符(第二個(gè)參數字符串比第三個(gè)參數字符串長(cháng)),那么第一個(gè)參數里的那個(gè)字符將被刪除。 translate("--abc--","abc-","ABC")=ABC 如果在第二個(gè)字符串參數中,一個(gè)字符出現多次,那么第一個(gè)出現的字符決定替換的字符。如果第三個(gè)字符串參數比第二個(gè)字符串參數長(cháng),那么多余字符將被忽略。
節點(diǎn)測試
節點(diǎn)測試:從指定軸中選擇特定的節點(diǎn)或節點(diǎn)類(lèi)型
節點(diǎn)測試的使用
- 從軸中選擇與指定的名稱(chēng)相同的節點(diǎn)。例如:child::name 表示選擇上下文節點(diǎn)中的名稱(chēng)為name的子節點(diǎn)
- 使用通配符(*)
- 使用 * 表示軸中所有的節點(diǎn)。child::* 選擇上下文節點(diǎn)的所有子元素節點(diǎn);attribute::* 表示上下文節點(diǎn)的所有屬性。
- node()
- 選擇軸中所有類(lèi)型節點(diǎn)
- text()
- 選擇軸中所有文本節點(diǎn)
- comment()
- 軸中所有的注釋節點(diǎn)
- processing-instruction()
- 選擇軸中所有的處理指令節點(diǎn)。processing-instruction()可以帶一個(gè)參數,指定處理指令目標的名稱(chēng)。
謂詞
謂詞為一個(gè)布爾表達式,用于再次過(guò)濾通過(guò)軸和節點(diǎn)測試的節點(diǎn)集。針對節點(diǎn)集中的每一個(gè)節點(diǎn),布爾表達式都將以此節點(diǎn)作為上下文節點(diǎn)來(lái)計算,如果布爾表達式結果為真,則在保留節點(diǎn),否則丟棄此節點(diǎn)。
謂詞以[]和其中的布爾表達式組成
例如 child::employee[position()=1]
首先得到上下文的所有employee子節點(diǎn),然后對employee節點(diǎn)集中的每個(gè)節點(diǎn)計算postion()=1,找到節點(diǎn)集中位置為1的節點(diǎn),位置不為1的所有節點(diǎn)都丟棄。
謂詞的處理過(guò)程是先計算表達式的值,然后將計算的結果轉換為布爾值。如果計算結果為數字,且該數字與上下文位置相等,則結果為真,否則為假。如果計算結果不是數字,那么結果將被轉換為好像調用了boolean()函數后的結果(關(guān)于函數請參考xpath中函數介紹)。因此employee[1]和employee[position()=1]是等價(jià)的。
位置路徑其實(shí)是經(jīng)過(guò)三步過(guò)濾最終得到節點(diǎn)集。此節點(diǎn)集包含0個(gè)或n個(gè)節點(diǎn)。
例如 在xslt中 對<xsl:apply-templates>元素的select屬性,可以如下定義其內容
<xsl:apply-templates select="descendant::monthly_pay[attribute::mode='cash']/>
表示上下文節點(diǎn)的后代中,名稱(chēng)為monthly_pay的所有節點(diǎn)中具有屬性mode且屬性mode的值為cash的所有節點(diǎn)。
簡(jiǎn)寫(xiě)語(yǔ)法
路徑表達式中各種軸的名稱(chēng)會(huì )讓路徑看起來(lái)很復雜。為簡(jiǎn)化路徑的書(shū)寫(xiě),xpath為一些常用的軸提供了簡(jiǎn)寫(xiě)語(yǔ)法
| 簡(jiǎn)寫(xiě) | 示例 |
| 省略child:: | employee/name ==child::employee/child::name |
| @代替attribute | employee[@sn='e1000']==child::employee[attribute::sn='e1000'] |
| // 代替/descendant-or-self::node() | //employee==/descendant-or-self::node()/child::employee即xml文檔中所有名稱(chēng)為employee的節點(diǎn) |
| (.)代替self::node() | self::node() 當前節點(diǎn) |
| (..) 代替parent::node() | parent::node() 當前節點(diǎn)的父節點(diǎn) |
其他示例:
.//name == self::node()/descendant::node()/child::name 當前節點(diǎn)下的所有名稱(chēng)為name的節點(diǎn)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。