XPath 使用简介
Xpath使用简介XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。 XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。 因此,对 XPath 的理解是很多高级 XML 应用的基础。 下面的示例显示一些基本的 XPath 表达式。通过将这些简单的表达式组合在一起,并使用各种 XPath 运算符和特殊字符,可以生成更复杂的表达式。
运算符和特殊字符 XPath 表达式是使用下表中所示的运算符和特殊字符构造的。
此表不包括布尔运算符和集运算符,这两个运算符在布尔、比较和集表达式或集运算中列出。 优先级顺序(从最高优先级到最低优先级)的定义如下表所示。
分组运算符 () 仅适用于顶级路径表达式。例如,(//author/degree | //author/name) 是有效的分组运算,但 //author/(degree | name) 不是。 筛选模式运算符 ([]) 的优先级高于路径运算符(/ 和 //)。例如,表达式 //comment()[3] 选择相对于文档中任意位置备注的父级索引等于 3 的所有备注。此表达式与表达式 (//comment())[3] 不同,后者选择相对于父级的所有备注集中的第三个备注。前一个表达式可以返回多个备注,后一个表达式只能返回一个备注。 这些运算符和特殊字符在本参考文档中详细说明。
路径运算符
特定类型的元素集合可以使用路径运算符(/ 和 //)确定。这些运算符根据其参数的“左侧”集合进行选择,“右侧”集合表示要选择的元素。子运算符 (/) 从左侧集合的直接子级中选择,而子代运算符 (//) 从左侧集合的任意子代中选择。因此,// 可以作为一个或多个层次级别的替代。 注意,路径运算符在执行查询时更改上下文。通过将路径运算符连接在一起,用户可以遍历文档树。
示例
通配符
通过使用通配符 (*) 集合,不使用元素名即可引用元素。* 集合引用作为当前上下文的子级的所有元素,与名称无关。 示例
注意,不支持模式 *:book。
属性
XPath 使用 @ 符号表示属性名。属性和子元素应公平对待,两种类型之间的功能应尽可能相当。
示例
注意,以下示例无效,因为属性不能包含任何子级。
复制代码
price/@exchange/total
查找多个属性
使用 @* 可以返回某个元素的所有属性。对于将属性作为记录中的字段的应用程序,此表达式可能非常有用。 示例
注意,不支持模式 @*:title。
XPath 集合
XPath 查询返回的集合在定义的范围内保留文档顺序、层次结构和标识。也就是说,按照文档顺序返回元素集合,没有重复的元素。因为根据定义,属性不排序,所以,为特定元素返回的属性不进行明确地排序。 具有特定标记名的所有元素的集合使用标记名本身表示。限定方法可以通过使用句点和正斜杠 (./) 表明元素是从当前上下文中选择,但是默认情况下将使用当前上下文,不必明确说明。
示例
为集合编制索引
使用 XPath 表达式可以很容易在节点集中查询特定的节点。只需为索引序号加上方括号。序号从 1 开始(第一个元素是编号 1)。 方括号字符 ([]) 的优先级高于斜杠字符(/ 和 //)。有关更多信息,请参见运算符和特殊字符。 示例
注意,索引相对于筛选的节点集。例如,请考虑以下数据。
Xml
<x> <y/> <y/> </x> <x> <y/> <y/> </x> 下表显示如何选择特定的 <x> 和 <y> 元素。
上面的示例简单地引用使用暗示默认值(例如 child:: 轴)的 XPath 集合。对于此轴,子节点集合按照前向文档顺序编制索引。 对于其他轴(例如 ancestor::),在 XPath 表达式中明确使用轴名。对于此轴,上级集合按照后向文档顺序编制索引。从上表中考虑此示例: x/y[1] 此表达式等效于以下表达式: x/child::y[1] 两个表达式均意味着“对每个 <x> 元素选择第一个名为 <y> 的子元素”。 下面的示例使用了相同的语法。 x/ancestor::y[1] 此示例意味着“对每个 <x> 元素选择第一个名为 <y> 的祖先元素(按照后向文档顺序)”。语法相同但是顺序相反。
查找集合中的最后一个元素
last() 函数对集合中的最后一个元素返回 True。注意,last 相对于父节点。 示例
分组
为了清楚起见,或正常的优先级不足以表达某个运算,可以使用括号为集合运算符分组。分组运算符可以在任何筛选表达式(谓词)中使用,例如 author[(degree or award)and publication]。也可以在顶级步长表达式中使用,例如 (book|magazine) 或 (author/degree | book/award)。不能应用于低级步长表达式。例如,author/(degree | award)无效。 示例
筛选器和筛选模式
通过将筛选子句 [pattern] 添加到集合中,可以对任何集合应用约束和分支。筛选器类似于 SQL WHERE 子句。筛选器中包含的模式称为“筛选模式”。筛选模式计算为布尔值,对集合中的每个元素进行测试。集合中所有未通过筛选模式测试的元素将从结果集合中省略。 为了方便起见,如果集合在筛选器内,若集合包含任何成员,则生成布尔值 TRUE,若集合为空,则生成 FALSE。author/degree 之类的表达式意味着,如果存在包含名为 <degree> 的子元素的 <author> 元素,集合到布尔值的转换函数将计算为 TRUE。 注意,在表达式的给定级别可以出现任意数目的筛选器。不允许使用空筛选器。 筛选器总是针对上下文进行计算。也就是说,表达式 book[author] 意味着,对每个找到的 <book> 元素测试是否包含 <author> 子元素。同样,book[author = 'Bob'] 意味着,对每个找到的 <book> 元素测试是否包含值为 Bob 的 <author> 子元素。还可以使用句点 (.) 字符检查上下文的值。例如,book[. = 'Trenton'] 意味着,对当前上下文中找到的每一本书,测试值是否为 Trenton。
示例
布尔、比较和集表达式
筛选模式可以包含布尔表达式、比较表达式和集表达式。下表中列出的快捷方式表示此 XSL 转换 (XSLT) 实现中提供的备选符号。本文档讨论这些表达式运算符。
* 扩展的 XPath 方法 万维网联合会 (W3C) 的运算符关键字语法使用空白和其他分隔符,不使用版本 2.5 中使用的美元字符 ($)。在 W3C 语法中,$xxx$ 格式的二进制关键字可以表示为 wsxxxws,其中 ws 是指标记终止符,可以是空白、单引号 (') 或双引号 (")。not() 等一元运算符使用函数表示法。尽管 Microsoft 实现支持这两种语法,但是,为了以后的兼容性,建议使用 W3C 语法。 比较运算符和布尔运算符的优先级顺序(从最高优先级到最低优先级)如下表所示。
在 XML 文档(例如 XSLT 样式表)中使用运算符时,< 和 > 标记必须分别转义为 < 和 >。例如,以下 XSLT 指令在所有 <price> 元素的数值小于或等于 10 的 <book> 元素上调用 XSLT 模板规则。 <xsl:apply-templates select="book[price <= 10]"/> XPath 表达式与 DOM 一起使用时,< 和 > 运算符不需要转义。例如,以下 JScript 语句选择所有 <price> 元素的数值小于或等于 10 的 <book> 元素。 var cheap_books = dom.selectNodes("book[price <= 10]"); 布尔表达式可以匹配特定值的所有节点或包含特定范围的节点的所有节点。以下是返回 false 的布尔表达式的示例 1 >= 2 运算符区分大小写。 逻辑与和逻辑或布尔运算符 and 和 or 分别执行逻辑与和逻辑或运算。这些运算符与分组括号组合使用时,可以用于构建复杂的逻辑表达式。 示例
布尔值非not 布尔运算符在筛选模式中对表达式的值求非。 示例
示例XML 文件 (test.xml)<?xml version="1.0"?> <test> <x a="1"> <x a="2" b="B"> <x> <y>y31</y> <y>y32</y> </x> </x> </x> <x a="2"> <y>y2</y> </x> <x a="3"> <y>y3</y> </x> </test> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |