公司最近組織了一次XSLT方面的培訓,就到http://www.w3school.com.cn/上瀏覽了些相關資料,收穫還不少,這裡稍作總結,方便以後查詢。
一 XPath簡介
XPath 是一門在 XML 文檔中尋找資訊的語言,可用來在 XML 文檔中對元素和屬性進行遍曆。
XPath 是 W3C XSLT 標準的主要元素,並且 XQuery 和 XPointer 同時被構建於 XPath 表達之上,因此要學習XSLT,首先要先瞭解一下XPATH。
二 XPath術語
這部分是照本宣科,參考:http://www.w3school.com.cn/xpath/xpath_nodes.asp
先參考一個xml文檔,如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<list>
<book>
<title language="en">Think in Java</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</book>
</list>
</root>
1.節點(Node)
在 XPath 中,有七種類型的節點:元素、屬性、文本、命名空間、處理指示、注釋以及文檔(根)節點。XML 文檔是被作為節點樹來對待的。樹的根被稱為文檔節點或者根節點。
在上面的例子中,<root>節點被成為文檔節點,<book>節點是元素節點,language="en"是屬性節點。
2.基本值(或稱原子值,Atomic value)
基本值是無父或無子的節點。
樣本:Think in Java,en都是原子節點。
3.節點關係
節點之間存在如下幾種關係,字面意思很明白了,就不作解釋了。
(1).父(Parent)
(2).子(Children)
(3).同胞(Sibling)
(4).先輩(Ancestor)
(5).後代(Descendant)
三 XPath的文法
XPath 使用路徑運算式來選取 XML 文檔中的節點或節點集。節點是通過沿著路徑 (path) 或者步 (steps) 來選取的。
1.位置路徑運算式
位置路徑可以是絕對的,也可以是相對的。
絕對路徑起始於正斜杠( / ),而相對路徑不會這樣。在兩種情況中,位置路徑均包括一個或多個步,每個步均被斜杠分割。
下面列出了最常用的路徑運算式
運算式 |
描述 |
| nodename |
選取此節點的所有子節點 |
| / |
從根節點選取 |
| // |
從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置 |
| . |
選取當前節點 |
| .. |
選取當前節點的父節點 |
| @ |
選取屬性 |
2.謂語
謂語用來尋找某個特定的節點或者包含某個指定的值的節點。謂語被嵌在方括弧中。
樣本:
//list/book[1]:提取list節點下的第一個book節點
//list/book[last()]:提取list節點下的最後一個book節點
//title[@language='en']:提取language屬性等於en的title節點
3.選取未知節點
XPath 萬用字元可用來選取未知的 XML 元素。
萬用字元 |
描述 |
| * |
匹配任何元素節點 |
| @* |
匹配任何屬性節點 |
| node() |
配任何類型的節點 |
4.XPath軸
軸可定義某個相對於當前節點的節點集。
軸名稱 |
結果 |
| ancestor |
選取當前節點的所有先輩(父、祖父等) |
| ancestor-or-self |
選取當前節點的所有先輩(父、祖父等)以及當前節點本身 |
| attribute |
選取當前節點的所有屬性 |
| child |
選取當前節點的所有子項目。 |
| descendant |
選取當前節點的所有後代元素(子、孫等)。 |
| descendant-or-self |
選取當前節點的所有後代元素(子、孫等)以及當前節點本身。 |
| following |
選取文檔中當前節點的結束標籤之後的所有節點。 |
| namespace |
選取當前節點的所有命名空間節點 |
| parent |
選取當前節點的父節點。 |
| preceding |
選取文檔中當前節點的開始標籤之前的所有節點。 |
| preceding-sibling |
選取當前節點之前的所有同級節點。 |
| self |
選取當前節點。 |
5.步(step)
步(step)包括:
軸(axis):定義所選節點與當前節點之間的樹關係
節點測試(node-test):識別某個軸內部的節點
零個或者更多謂語(predicate): 更深入地提煉所選的節點集
步的文法:
軸名稱::節點測試[謂語]
樣本:
例子 |
結果 |
| child::book |
選取所有屬於當前節點的子項目的 book 節點 |
| attribute::languane |
選取當前節點的 languange 屬性 |
| child::* |
選取當前節點的所有子項目 |
| attribute::* |
選取當前節點的所有屬性 |
| child::text() |
選取當前節點的所有文本子節點 |
| child::node() |
選取當前節點的所有子節點 |
| descendant::book |
選取當前節點的所有 book 後代 |
| ancestor::book |
選擇當前節點的所有 book 先輩 |
四.XPath運算子
XPath支援的運算主要有加、減、乘、除、模、與、或及相關比較運算(如:等於,大於,小於等),具體可以參考http://www.w3school.com.cn/xpath/xpath_operators.asp
五.相關函數
XPath支援的函數很多,具體可以參考:http://www.w3school.com.cn/xpath/xpath_functions.asp