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 expression Output

XPath - 節點

在本章中,我們將詳細瞭解 XPath 表示式,涵蓋 XPath 定義和處理的常見節點型別。

序號 節點型別和描述
1

XML 文件的根元素節點。

2 元素

元素節點。

3 文字

元素節點的文字。

4 屬性

元素節點的屬性。

5 註釋

註釋

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 Absolute Path Output

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 Relative Path Output

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 axes

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>

驗證輸出

Formatted Wild Card Output

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>

驗證輸出

Formatted predicate Output
廣告