簡(jiǎn)述XPath,XSLT,XLink與XPointer
XSLT、XLink 和 XPointer 都是 W3C 標(biāo)準(zhǔn)。XSLT 和 XPath,以及 XSL Formatting Object (XSL-FO) 構(gòu)成了 W3C eXtensible Stylesheet Language (XSL) 系列規(guī)范。
XSLT、XLink 和 XPointer 都是 W3C 標(biāo)準(zhǔn)。XSLT 和 XPath,以及 XSL Formatting Object (XSL-FO) 構(gòu)成了 W3C eXtensible Stylesheet Language (XSL) 系列規(guī)范。
表示:XSLT 廣泛使用 XPath 進(jìn)行匹配――也就是,測(cè)試節(jié)點(diǎn)是否匹配指定模式。XSLT 指定了 XPath 使用的上下文。如果想使用 XSLT,就應(yīng)該了解 XPath。在 關(guān)于本教程中使用的例子 中,您看到了 AuctionItemSummary-Base.xsl 樣式表包含了 XPath 表達(dá)式。XSLT 使用這些 XPath 表達(dá)式,在源文檔中查找匹配條件的元素,也使用它們來(lái)顯示結(jié)果文檔中的信息。XSLT 使用 XPath 函數(shù)來(lái)執(zhí)行算術(shù)和字符串操縱操作。
鏈接:XLink 在 XML 中提供了 HTML 超鏈接概念的一般化。XLink 為要插入 XML 文檔的元素提供了某種語(yǔ)法,以便把資源鏈接在一起,及描述它們的關(guān)系。這些鏈接可以是單向的,比如 HTML 的超鏈接,或者更加復(fù)雜的。XLink 使用 XPointer 來(lái)查找資源。
指向:XPointer 是 XPath 的擴(kuò)展,提供了到 XML 文檔及其內(nèi)部的尋址。XPointer 一般化了 XPath 節(jié)點(diǎn)的概念,使用了 XPointer 位置、點(diǎn)和范圍的概念。XPointer 也指定了在 XPath 計(jì)算過(guò)程中使用的上下文,并提供了在 XPath 中不可用的其他函數(shù)。
一句話小結(jié):
XML:其他技術(shù)的基礎(chǔ)(數(shù)據(jù))。
XML Schema:數(shù)據(jù)格式規(guī)則。
XSLT:數(shù)據(jù)表示/匹配。
XLink:鏈接。
XPointer and XPath:尋址。
XML語(yǔ)法
一.位置路徑
1.路徑
位置路徑是 XPath 中最有用也是應(yīng)用最廣泛的特性。位置路徑是 XPath 表達(dá)式的特化(參見 表達(dá)式)。位置路徑標(biāo)識(shí)了和上下文有關(guān)的一組 XPath 節(jié)點(diǎn)。XPath 定義了兩種語(yǔ)法:簡(jiǎn)化語(yǔ)法和非簡(jiǎn)化語(yǔ)法。
位置路徑有相對(duì)和絕對(duì)兩種類型。
相對(duì)位置路徑由使用 / 分隔的定位步序列組成。比如:
list/item[currentPrice<20.0]
絕對(duì)位置路徑由 / 和后面可選的相對(duì)位置路徑組成,其中 / 表示根節(jié)點(diǎn)。
/list/item[currentPrice<20.0]
XPath 表達(dá)式 /list 就確定了一個(gè)單獨(dú)的節(jié)點(diǎn)――list 根元素。
The XPath 表達(dá)式 /list/item 確定了所有 item 元素。
XPath 表達(dá)式可以引用屬性及 XML 文檔中的元素。當(dāng)引用屬性時(shí),使用 @ 字符。例如,下面的 XPath 表達(dá)式確定了 currentPrice 元素,其 currency 屬性包含值 EUR:
/list/item/currentPrice[@currency="EUR"]
@ 用于引用屬性。比如,位置路徑 @currency 標(biāo)識(shí)了 currency 屬性。list/item[@private] 標(biāo)識(shí)帶有 private 屬性的 item 元素,意即 AuctionItemList.xml 中的所有 item 元素。
* 用于引用上下文結(jié)點(diǎn)的所有子元素。@* 用于引用上下文結(jié)點(diǎn)的所有屬性。
[] 也可用于引用有序序列中的特定元素。比如,list/item[2] 代表第二個(gè) item 元素。實(shí)際上 [] 是一個(gè)謂詞(參見謂詞)。
// 用于引用上下文節(jié)點(diǎn)的所有孩子。比如,//item 表示所有的 item 元素,而 //list/item 引用以 list 為父元素的所有 item 元素(在該例中即所有的 item 元素)。
. 用于引用上下文節(jié)點(diǎn)自身。比如,. 選擇上下文節(jié)點(diǎn),而 .//item 代表作為上下文節(jié)點(diǎn)孩子的所有 item 元素。
.. 用于引用上下文節(jié)點(diǎn)的父節(jié)點(diǎn)。比如,在第一個(gè)bidIncrement 元素的上下文中, ../item 就表示第一個(gè) item 元素。
2.謂詞
謂詞在位置路徑中用于篩選當(dāng)前節(jié)點(diǎn)集。謂詞包含一個(gè) boolean 表達(dá)式(或者很容易轉(zhuǎn)化成 boolean 值的表達(dá)式)。用這個(gè)布爾表達(dá)式測(cè)試當(dāng)前節(jié)點(diǎn)集的每個(gè)成員,如果表達(dá)式成立則保留該成員否則丟棄。謂詞放在方括號(hào)[]中。比如下面的位置路徑:
list/item/currentPrice[@currency="EUR"]
在計(jì)算過(guò)程中,AuctionItemList.xml 中所有的 currentPrice 元素都放在選擇的節(jié)點(diǎn)集中。然后計(jì)算謂詞 @currency="EUR",貨幣中不包含值 EUR 的 currentPrice 元素被拋棄。
謂詞也可以使用關(guān)系運(yùn)算符 >、<、>=、<= 和 !=。
二.表達(dá)式
1.布爾表達(dá)式
XML 文檔中包含 XPath 表達(dá)式時(shí),必須遵循 XML 1.0 的結(jié)構(gòu)良好性規(guī)則,任何 < 或 <= 字符必須分別用 < 和 <= 表示。比如,XPath 表達(dá)式 bidIncrement < 5 在 XPointer 中是合法的,但是在 XSLT 文檔中必須寫成 bidIncrement < 5。
2.數(shù)字
XPath 數(shù)字是 64 位雙精度浮點(diǎn)數(shù)。XPath 數(shù)字包括“非數(shù)字” NaN 值、正無(wú)窮和負(fù)無(wú)窮、正零和負(fù)零。
XPath 提供的數(shù)值運(yùn)算符有:+(加)、-(減)、*(乘)、div(除)和 mod(整除求余)。
提示:減法(-)運(yùn)算符的前面必須有空格,因?yàn)?span lang="EN-US"> XML 允許字符串中包含“-”字符。
下面是 XPath 數(shù)字表達(dá)式的一些例子:
7 + 3 返回 10
7 - 3 返回 4
7 * 3 返回 21
7 div 3 返回 2.3333333333333335
7 mod 3 返回 1
3.字符串
XPath 中的字符串使用引號(hào)(' 或 ")包圍起來(lái)。如果 XML 文檔中的 XPath 字符串包含引號(hào),可以選擇:
分別使用 ' 或 " 引起來(lái)。比如,description = 'New 256m "USB" MP3 player'
三.函數(shù)庫(kù)
XPath 定義了一組函數(shù),稱為核心函數(shù)庫(kù)。每個(gè)函數(shù)從三個(gè)方面來(lái)定義:
(1)函數(shù)名
(2)返回類型(必須的,不能使用 void)
(3)參數(shù)類型(可以沒有參數(shù)或者帶有多個(gè)參數(shù),參數(shù)可以是必需的也可以是可選的)
函數(shù)被分成四類,以下分別介紹:
1.節(jié)點(diǎn)集函數(shù)
節(jié)點(diǎn)集函數(shù)提供關(guān)于一組節(jié)點(diǎn)(一個(gè)或多個(gè)節(jié)點(diǎn))的信息。常用的節(jié)點(diǎn)集函數(shù)有:
last()――返回一個(gè)稱為上下文大小的數(shù)字,即給定上下文中的節(jié)點(diǎn)數(shù),不同于最后一個(gè)節(jié)點(diǎn)。
position()――返回一個(gè)稱為上下文位置的數(shù)字,集當(dāng)前節(jié)點(diǎn)在給上下文節(jié)點(diǎn)集(列表)中的位置。比如,可以用表達(dá)式 position()=last() 測(cè)試處理的是否是集合中的最后一個(gè)節(jié)點(diǎn)。
count(node-set)――返回實(shí)參節(jié)點(diǎn)集中的節(jié)點(diǎn)數(shù)。比如,在 AuctionItemList.xml 文檔的上下文中,count(//item) 返回 item 元素的個(gè)數(shù),即 7。
id(object)――返回一個(gè)節(jié)點(diǎn)集,根據(jù)在 DTD 中聲明為 ID 類型的唯一標(biāo)識(shí)符選擇元素。因?yàn)樵?span lang="EN-US"> AuctionItemList.xml 中沒有使用 DTD,這個(gè)例子中得到的節(jié)點(diǎn)集總是空集。Id("ItemId0001") 返回一個(gè)空節(jié)點(diǎn)集。
XPath 還定義了和節(jié)點(diǎn)名及名稱空間有關(guān)的其他三個(gè)函數(shù):
local-name()
namespace-uri()
name()
2.字符串函數(shù)
通過(guò)字符串函數(shù)您可以操縱字符串。常用的字符串函數(shù)有:
string()――把參數(shù)對(duì)象或者上下文結(jié)點(diǎn)轉(zhuǎn)化成字符串。合法的參數(shù)包括節(jié)點(diǎn)集、數(shù)字、布爾值或者其他任何類型――但是對(duì)于最后一種情況轉(zhuǎn)換的結(jié)果不可預(yù)料。建議使用 XSLT 函數(shù) format-number 把數(shù)字轉(zhuǎn)化成字符串,或者使用 XSLT 元素 xsl:number 提供給用戶。
concat()――以兩個(gè)或更多字符串作為參數(shù)并返回這些字符串的連接。比如,concat("Original ","recording ","Blue Train LP record") 返回 "Original recording Blue Train LP record"。
starts-with()――如果第一個(gè)字符串參數(shù)以第二個(gè)字符串參數(shù)開始則返回 true,否則返回 false。比如,starts-with("Miles Smiles album, CD", "Miles") 返回 true。
contains()――如果第一個(gè)字符串參數(shù)包含第二個(gè)字符串參數(shù)則返回 true,否則返回 false。比如,contains("Miles Smiles album, CD", "album") 返回 true。
其他的 XPath 字符串函數(shù)包括:substring()、substring-before()、substring-after()、string-length()、normalize-space() 和 translate()。
3.布爾函數(shù)
布爾函數(shù)用于把一個(gè)對(duì)象或字符串轉(zhuǎn)化成 true 或者 false,或者直接獲得真或假的值。布爾函數(shù)有:
boolean()――根據(jù)以下規(guī)則返回作為參數(shù)傳遞的對(duì)象轉(zhuǎn)換成布爾值的結(jié)果:不同于 0 或者 NaN 的數(shù)字為 true;非空的節(jié)點(diǎn)集或者字符串為 true。其他類型的對(duì)象已不可預(yù)料的方式轉(zhuǎn)換。
not()――如果作為參數(shù)傳遞的布爾值為 false 返回 true,否則返回 false。
true() 和 false()――分別返回 true 或 false。這些函數(shù)很有用,因?yàn)樵?span lang="EN-US"> XPath 中 true 和 false 被看作是普通的字符串而不是真和假的值。
lang()――如果上下文節(jié)點(diǎn)的語(yǔ)言和字符串參數(shù)中指定的語(yǔ)言相同,或者是它的一種子語(yǔ)言返回 true,否則返回 false。
4.數(shù)字函數(shù)
數(shù)字函數(shù)是 XPath 的數(shù)值函數(shù),都返回?cái)?shù)字。其中包括:
number()――把可選的對(duì)象參數(shù)(如果沒有指定參數(shù)則使用上下文節(jié)點(diǎn))轉(zhuǎn)化成數(shù)字,轉(zhuǎn)換的規(guī)則如下:
布爾值 true 轉(zhuǎn)換成1,false 轉(zhuǎn)換成 0。
字符串轉(zhuǎn)換成合理的數(shù)字。
節(jié)點(diǎn)集首先轉(zhuǎn)換成字符串,然后把這個(gè)字符串轉(zhuǎn)換成數(shù)字。
其他類型對(duì)象以不可預(yù)料的方式轉(zhuǎn)換。比如,number("250") 返回 250,而 number("miles1965") 返回 NaN。
sum()――對(duì)節(jié)點(diǎn)集參數(shù)中的所有節(jié)點(diǎn)應(yīng)用 number() 函數(shù)后返回它們的和。
floor()――返回不大于數(shù)字參數(shù)的最大整數(shù)數(shù)字。比如,floor(2.75) 返回 2。
ceiling()――返回不小于數(shù)字參數(shù)的最小整數(shù)數(shù)字。比如,ceiling(2.75) 返回 3。
round()――返回和數(shù)字參數(shù)最接近的整數(shù)數(shù)字。比如,round(2.75) 返回 3。