Xpath 简明教程
XPath - Overview
在学习 XPath 前,我们应该首先理解 XSL(即 *E*xtensible *S*tylesheet *L*anguage)。它与 XML 的关系类似于 CSS 与 HTML 的关系。
Need for XSL
对于 HTML 文档,标签(例如 table、div、span 等)是预定义的。浏览器知道如何使用 CSS 样式向其添加样式并显示它们。但对于 XML 文档,标签是未预定义的。为了理解和设置 XML 文档的样式, World Wide Web Consortium (W3C) 开发了 XSL,它可以用作基于 XML 的样式表语言。XSL 文档指定浏览器应如何呈现 XML 文档。
以下是 XSL 的主要部分 −
-
XSLT − 用于将 XML 文档转换为其他各种类型的文档。
-
XPath − 用于浏览 XML 文档。
-
XSL-FO − 用于设置 XML 文档的格式。
What is XPath?
XPath 是万维网联盟 (W3C) 的官方推荐。它定义了一种在 XML 文件中查找信息的语言。它用于遍历 XML 文档的元素和属性。XPath 提供了多种类型的表达式,可用于从 XML 文档中查询相关信息。
-
Structure Definitions − XPath 定义 XML 文档的部分,如元素、属性、文本、命名空间、处理指令、注释和文档节点
-
Path Expressions − XPath 提供强大的路径表达式,可在 XML 文档中选择节点或节点列表。
-
Standard Functions − XPath 提供丰富的标准函数库,用于处理字符串值、数值值、日期和时间比较、节点和 QName 处理、序列处理、Boolean 值等。
-
Major part of XSLT − XPath 是 XSLT 标准中的主要元素之一,是使用 XSLT 文档必备的知识。
-
W3C recommendation − XPath 是万维网联盟 (W3C) 的正式推荐。
在使用 XPath 时,应谨记以下几点 −
-
XPath 是 XSLT 标准的核心组件。
-
没有 XPath,XSLT 无法工作。
-
XPath 是 XQuery 和 XPointer 的基础。
XPath - Expression
XPath 表达式通常定义一个模式,以便选择一组节点。XSLT 使用这些模式来执行转换,XPointer 使用这些模式来寻址。
XPath 规范指定了七种类型的节点,它们可以是 XPath 表达式执行的输出。
-
Root
-
Element
-
Text
-
Attribute
-
Comment
-
Processing Instruction
-
Namespace
XPath 使用路径表达式从 XML 文档中选择节点或节点列表。
以下是用于从 XML 文档中选择任何节点/节点列表的有用路径和表达式的列表。
S.No. |
Expression & Description |
1 |
node-name 选择具有指定名称 “nodename” 的所有节点 |
2 |
/ 从根节点开始选择 |
3 |
// 从符合选择的当前节点开始选择 |
4 |
. Selects the current node |
5 |
.. 选择当前节点的父级 |
6 |
@ Selects attributes |
7 |
student 示例 − 选择带有名称“student”的所有节点 |
8 |
class/student 示例 − 所有学生元素都是 class 的子项 |
9 |
无论在文档中的什么位置,选择所有 student 元素 |
Example
在此示例中,我们创建了一个示例 XML 文档 students.xml 及其样式表文档 students.xsl ,该文档使用 XPath 表达式在各种 XSL 标记的 select 属性下,获取每个 student 节点的学号、first name、last name、nickname 和成绩的值。
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 - Absolute Path
位置路径指定 XML 文档中节点的位置。此路径可以是绝对路径或相对路径。如果位置路径以根节点或 “/” 开头,则它是一个绝对路径。以下是使用绝对路径定位元素的一些示例。
/class/student − 选择班级根节点中的学生节点。
<xsl:for-each select = "/class/student">
/class/student/firstname − 选择班级根节点中某个学生节点的 firstName。
<p><xsl:value-of select = "/class/student/firstname"/></p>
Example
在此示例中,我们创建了一个 XML 文档示例 students.xml 和使用 XPath 表达式的样式表文档 students.xsl 。
下面是使用的 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 - Relative Path
位置路径指定 XML 文档中节点的位置。此路径可以是绝对路径或相对路径。如果位置路径以我们选择的节点开头,则它是一个相对路径。
以下是使用相对路径定位元素的一些示例。
firstname − 选择与学生节点相关的 firstName。
<p><xsl:value-of select = "firstname"/></p>
Example
在此示例中,我们创建了一个 XML 文档示例 students.xml 和使用 XPath 表达式的样式表文档 students.xsl 。
下面是使用的 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 - Axes
由于位置路径使用绝对或相对路径定义节点的位置,因此轴用于按其关系(如 parent, child, sibling, 等)识别元素。之所以这样命名轴,是因为它们引用元素相对于某个元素所在的轴。
以下是各种轴值的列表。
S.No. |
Axis & Description |
1 |
ancestor 表示当前节点的祖先,其中包括直到根节点的父节点。 |
2 |
ancestor-or-self 表示当前节点及其祖先。 |
3 |
attribute 表示当前节点的属性。 |
4 |
child 表示当前节点的子代。 |
5 |
descendant 表示当前节点的后代。后代包括从该节点到叶节点(没有更多子代)的所有子代。 |
6 |
descendant-or-self 表示当前节点及其后代。 |
7 |
following 表示当前节点之后的所有节点。 |
8 |
following-sibling 表示上下文节点后面的所有兄弟节点。兄弟节点与当前节点处于同一级别,且共享其父级。 |
9 |
namespace 表示当前节点的命名空间。 |
10 |
parent 表示当前节点的父级。 |
11 |
preceding 表示当前节点之前的所有节点(即在它的起始标签之前)。 |
12 |
self Represents the current node. |
以下是轴使用的一些示例。
firstname − 选择与学生节点相关的 firstName。
<p><xsl:value-of select = "firstname"/></p>
<xsl:value-of select = "/class/student/preceding-sibling::comment()"/>
Example
在此示例中,我们创建了一个 XML 文档示例 students.xml 和使用 XPath 表达式的样式表文档 students.xsl 。
下面是使用的 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 - Operators
在本章中,我们将详细了解 XPath 运算符和函数,包括常用的 XPath defines 和 handles 。XPath 定义了对节点、字符串、数字和布尔类型的运算符和函数。
以下是我们将要讨论的列表。
S.No. |
Operators/Functions & Description |
1 |
Comparision Operators 比较运算符用于比较值。 |
2 |
Boolean Operators 布尔运算符用于检查“与”、“或”和“非”函数。 |
3 |
Number Functions/OperatorsOperators/Functions on numbers. |
4 |
String FunctionsVarious string functions. |
5 |
Node Functions/Operators 作用于节点的各种函数和运算符。 |
XPath - Wildcard
XPath 定义了以下节点通配符,可与 XPath 表达式配合使用。
S.No. |
WildCard & Description |
1 |
用于匹配任何节点。 |
2 |
. 用于匹配上下文中当前的节点。 |
3 |
@ *用于匹配任何属性 |
4 |
node() 用于匹配任何类型的节点 |
Example
此示例通过遍历每个学生,创建一个带有其详细信息的 <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 - Predicate
谓词是指用方括号编写的 XPath 表达式。它用于限制节点集中符合某些条件的所选节点。例如,
S.No. |
Predicate & Description |
1 |
/class/student[1] 选择作为 class 元素子代的第一个 student 元素。 |
2 |
/class/student[last()] 选择作为 class 元素子代的最后一个 student 元素。 |
3 |
/class/student[@rolllno = 493] 选择 rollno 为 493 的 student 元素。 |
4 |
/class/student[marks>85] 选择成绩大于 85 的学生元素。 |
Example
此示例通过遍历每个学生,创建一个带有其详细信息的 <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>