
- XPath 教程
- XPath - 首頁
- XPath - 概述
- XPath - 表示式
- XPath - 節點
- XPath - 絕對路徑
- XPath - 相對路徑
- XPath - 軸
- XPath - 運算子
- XPath - 萬用字元
- XPath - 謂詞
- XPath 有用資源
- XPath 快速指南
- XPath - 有用資源
- XPath - 討論
XPath 快速指南
XPath - 概述
在學習 XPath 之前,我們應該首先了解 XSL,它代表 **可擴充套件樣式表語言**。它類似於 XML,就像 CSS 對於 HTML 一樣。
XSL 的需求
對於 HTML 文件,標籤是預定義的,例如 table、div、span 等。瀏覽器知道如何為它們新增樣式並使用 CSS 樣式顯示它們。但在 XML 文件的情況下,標籤沒有預定義。為了理解和設定 XML 文件的樣式,**全球資訊網聯盟 (W3C)** 開發了 XSL,它可以用作基於 XML 的樣式表語言。XSL 文件指定瀏覽器應如何呈現 XML 文件。
以下是 XSL 的主要部分:
XSLT - 用於將 XML 文件轉換為各種其他型別的文件。
XPath - 用於導航 XML 文件。
XSL-FO - 用於格式化 XML 文件。
什麼是 XPath?
XPath 是全球資訊網聯盟 (W3C) 的正式推薦。它定義了一種在 XML 檔案中查詢資訊的語言。它用於遍歷 XML 文件的元素和屬性。XPath 提供各種型別的表示式,可用於從 XML 文件中查詢相關資訊。
結構定義 - XPath 定義 XML 文件的各個部分,如元素、屬性、文字、名稱空間、處理指令、註釋和文件節點
路徑表示式 - XPath 提供強大的路徑表示式來選擇 XML 文件中的節點或節點列表。
標準函式 - XPath 提供豐富的標準函式庫,用於處理字串值、數值、日期和時間比較、節點和 QName 操作、序列操作、布林值等。
XSLT 的主要部分 - XPath 是 XSLT 標準中的主要元素之一,並且為了使用 XSLT 文件,必須掌握 XPath 的知識。
W3C 推薦 - XPath 是全球資訊網聯盟 (W3C) 的正式推薦。
在使用 XPath 時,應該牢記以下幾點:
- XPath 是 XSLT 標準的核心元件。
- 沒有 XPath,XSLT 就無法工作。
- XPath 是 XQuery 和 XPointer 的基礎。
XPath - 表示式
XPath 表示式通常定義一個模式以選擇一組節點。這些模式由 XSLT 用於執行轉換或由 XPointer 用於定址目的。
XPath 規範指定了七種型別的節點,這些節點可以是 XPath 表示式執行的結果。
- 根
- 元素
- 文字
- 屬性
- 註釋
- 處理指令
- 名稱空間
XPath 使用路徑表示式從 XML 文件中選擇節點或節點列表。
以下是從 XML 文件中選擇任何節點/節點列表的有用路徑和表示式的列表。
序號 | 表示式和描述 |
---|---|
1 | 節點名稱 選擇所有具有給定名稱“節點名稱”的節點 |
2 | / 選擇從根節點開始 |
3 | // 選擇從與選擇匹配的當前節點開始 |
4 | . 選擇當前節點 |
5 | .. 選擇當前節點的父節點 |
6 | @ 選擇屬性 |
7 | 學生 示例 - 選擇所有名稱為“學生”的節點 |
8 | 班級/學生 示例 - 選擇作為班級子節點的所有學生元素 |
9 | //學生 選擇所有學生元素,無論它們在文件中的什麼位置 |
示例
在此示例中,我們建立了一個示例 XML 文件 students.xml 及其樣式表文檔 students.xsl,該文件在各種 XSL 標籤的 select 屬性下使用 XPath 表示式來獲取每個學生節點的學號、名字、姓氏、暱稱和分數的值。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <tr> <td> <xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
驗證輸出

XPath - 節點
在本章中,我們將詳細瞭解 XPath 表示式,涵蓋 XPath 定義和處理的常見節點型別。
XPath - 絕對路徑
位置路徑指定 XML 文件中節點的位置。此路徑可以是絕對路徑或相對路徑。如果位置路徑以根節點或“/”開頭,則它是絕對路徑。以下是使用絕對路徑定位元素的一些示例。
/class/student - 選擇 class 根節點內的 student 節點。
<xsl:for-each select = "/class/student">
/class/student/firstname - 選擇 class 根節點內 student 節點的 firstname。
<p><xsl:value-of select = "/class/student/firstname"/></p>
示例
在此示例中,我們建立了一個示例 XML 文件 students.xml 及其樣式表文檔 students.xsl,該文件使用了 XPath 表示式。
以下是使用的示例 XML。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/" > <html> <body> <h3>Details of each Students. </h3> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <tr> <td><xsl:value-of select = "/class/student[1]/@rollno"/></td> <td><xsl:value-of select = "/class/student[1]/firstname"/></td> <td><xsl:value-of select = "/class/student[1]/lastname"/></td> <td><xsl:value-of select = "/class/student[1]/nickname"/></td> <td><xsl:value-of select = "/class/student[1]/marks"/></td> </tr> <tr> <td> <xsl:value-of select = "/class/student/@rollno"/> </td> <td><xsl:value-of select = "/class/student[2]/firstname"/></td> <td><xsl:value-of select = "/class/student[2]/lastname"/></td> <td><xsl:value-of select = "/class/student[2]/nickname"/></td> <td><xsl:value-of select = "/class/student[2]/marks"/></td> </tr> <tr> <td> <xsl:value-of select = "/class/student[3]/@rollno"/> </td> <td><xsl:value-of select = "/class/student[3]/firstname"/></td> <td><xsl:value-of select = "/class/student[3]/lastname"/></td> <td><xsl:value-of select = "/class/student[3]/nickname"/></td> <td><xsl:value-of select = "/class/student[3]/marks"/></td> </tr> </table> </body> </html> </xsl:template> </xsl:stylesheet>
驗證輸出

XPath - 相對路徑
位置路徑指定 XML 文件中節點的位置。此路徑可以是絕對路徑或相對路徑。如果位置路徑以我們已選擇的節點開頭,則它是相對路徑。
以下是使用相對路徑定位元素的一些示例。
firstname - 選擇與 student 節點相關的 firstname。
<p><xsl:value-of select = "firstname"/></p>
示例
在此示例中,我們建立了一個示例 XML 文件 students.xml 及其樣式表文檔 students.xsl,該文件使用了 XPath 表示式。
以下是使用的示例 XML。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/" > <html> <body> <h3>Details of each Students. </h3> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "/class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
驗證輸出

XPath - 軸
由於位置路徑使用絕對或相對路徑定義節點的位置,因此軸用於透過其關係(如 **父、子、兄弟** 等)識別元素。軸之所以這樣命名,是因為它們指的是元素相對於某個元素所在的軸。
以下是各種軸值的列表。
序號 | 軸和描述 |
---|---|
1 | 祖先 表示當前節點的祖先,包括從父節點到根節點的所有節點。 |
2 | 祖先或自身 表示當前節點及其祖先。 |
3 | 屬性 表示當前節點的屬性。 |
4 | 子 表示當前節點的子節點。 |
5 | 後代 表示當前節點的後代。後代包括節點的子節點到葉子節點(沒有更多子節點)。 |
6 | 後代或自身 表示當前節點及其後代。 |
7 | 後續 表示在當前節點之後的所有節點。 |
8 | 後續兄弟 表示上下文節點的後續兄弟。兄弟節點與當前節點位於同一級別,並共享其父節點。 |
9 | 名稱空間 表示當前節點的名稱空間。 |
10 | 父 表示當前節點的父節點。 |
11 | 前序 表示在當前節點之前的所有節點(即在它開始標籤之前)。 |
12 | 自身 表示當前節點。 |
以下是關於軸使用的一些示例。
firstname - 選擇與 student 節點相關的 firstname。
<p><xsl:value-of select = "firstname"/></p> <xsl:value-of select = "/class/student/preceding-sibling::comment()"/>
示例
在此示例中,我們建立了一個示例 XML 文件 students.xml 及其樣式表文檔 students.xsl,該文件使用了 XPath 表示式。
以下是使用的示例 XML。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <!-- Comment: This is a list of student --> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/" > <html> <body> <xsl:value-of select = "/class/student/preceding-sibling::comment()"/> <br/> <xsl:text>First Student: </xsl:text> <xsl:value-of select = "/class/student/child::firstname" /> </body> </html> </xsl:template> </xsl:stylesheet>
驗證輸出

XPath - 運算子
在本章中,我們將詳細瞭解 XPath 運算子和函式,涵蓋常用 XPath **定義** 和 **處理**。XPath 定義了節點、字串、數字和布林型別上的運算子和函式。
以下是我們將要討論的列表。
序號 | 運算子/函式和描述 |
---|---|
1 | 比較運算子 比較運算子用於比較值。 |
2 | 布林運算子 布林運算子用於檢查“與”、“或”和“非”功能。 |
3 | 數字函式/運算子 數字上的運算子/函式。 |
4 | 字串函式 各種字串函式。 |
5 | 節點函式/運算子 作用於節點的各種函式和運算子。 |
XPath - 萬用字元
XPath 定義了以下節點上的萬用字元,用於與 XPath 表示式一起使用。
序號 | 萬用字元和描述 |
---|---|
1 | * 用於匹配任何節點。 |
2 | . 用於匹配上下文中的當前節點。 |
3 | @* 用於匹配任何屬性 |
4 | 節點() 用於匹配任何型別的節點 |
示例
此示例透過迭代每個學生,建立了一個包含 <student> 元素及其詳細資訊的表格。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <xsl:apply-templates select = "class/*" /> </body> </html> </xsl:template> <xsl:template match = "class/*"> <xsl:apply-templates select = "@rollno" /> <xsl:apply-templates select = "firstname" /> <xsl:apply-templates select = "lastname" /> <xsl:apply-templates select = "nickname" /> <xsl:apply-templates select = "marks" /> <br /> </xsl:template> <xsl:template match = "@rollno"> <span style = "font-size = 22px;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "firstname"> First Name:<span style = "color:blue;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "lastname"> Last Name:<span style = "color:green;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "nickname"> Nick Name:<span style = "color:red;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "marks"> Marks:<span style = "color:gray;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> </xsl:stylesheet>
驗證輸出

XPath - 謂詞
謂詞指的是寫在方括號中的 XPath 表示式。它指的是根據某些條件限制節點集中選定的節點。例如,
序號 | 謂詞和描述 |
---|---|
1 | /class/student[1] 選擇作為 class 元素子節點的第一個 student 元素。 |
2 | /class/student[last()] 選擇作為 class 元素子節點的最後一個 student 元素。 |
3 | /class/student[@rolllno = 493] 選擇學號為 493 的 student 元素。 |
4 | /class/student[marks>85] 選擇分數大於 85 的 student 元素。 |
示例
此示例透過迭代每個學生,建立了一個包含 <student> 元素及其詳細資訊的表格。它計算學生節點的位置,然後列印學生詳細資訊以及序列號。
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "/class/student[1]"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> <xsl:for-each select = "/class/student[last()]"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> <xsl:for-each select = "/class/student[@rollno = 493]"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> <xsl:for-each select = "/class/student[marks > 85]"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
驗證輸出
