我认为 XPath 表达式只能指向/选择元素或元素属性是否正确?
3 回答
对表达式求值以产生一个对象,该对象具有以下四种基本类型之一:
- 节点集(无重复节点的无序集合)
- 布尔值(真或假)
- 数字(浮点数)
- 字符串(一系列 UCS 字符)
节点是文档树的元素,因此它们可以包括元素节点、属性节点和文本节点。请注意,XPath 表达式可以选择多个节点——即多个元素——而不仅仅是单个节点。
一些例子:
//monkey
- 将选择<monkey>
文档中的所有元素,一个节点集count(//monkey)
- 将返回所有<monkey>
元素的计数,一个数字contains("mouse", "cat")
- 将返回 false,一个布尔值(//monkey)[0]/text()
- 将返回第一个<monkey>
元素的文本,一个字符串
由于您可以自由使用集合运算符,因此您几乎可以选择任何东西。
//x | //@x
如果我没记错语法,应该给你一个所有 x 元素和所有 x 属性的列表。(管道是联合运算符)
Dave Webb 目前接受的答案只是部分正确。
可以选择所有七种类型的节点:
- 根(文档节点),如
"/"
- 元素,例如:
"/*"
- 属性,例如:
"//@*"
- 文本节点,如:
"//text()"
- 评论节点,如:
"//comment()"
- 处理指令节点,如:
"//processing-instruction()"
- 命名空间节点,如:
"//namespace::*"
此外,很高兴知道根据给定 XPath 引擎的主机,所选节点集可能包含来自多个文档的节点。例如,如果主机是 XSLT,则以下 XPath 表达式:
"document($uri1)//* | document($uri2)//*"
选择由 标识的文档中的$uri1
所有元素和由 标识的文档中的所有元素的并集$uri2
。
所选节点集中的节点顺序是“文档顺序”(如深度优先),但这仅适用于属于同一文档的节点。如果选择了属于多个文档的节点,则不定义属于不同文档的节点之间的顺序(取决于实现)。
最后,在 XPath 2.0 中,选择还可以是任何类型的项目序列(可能是混合的),(并且具有预定义的顺序)并且可能存在无限的项目类型集(如果使用用户定义的类型),包括所有内置的 XML 模式类型。
在 XPath 2.1(预计将在我们发言时发布的 W3C 工作草案)中,还将有一个“function-item”类型,因为函数将成为该语言的第一类类型,并且可以作为参数传递,由 a 返回函数,按顺序存储或动态创建。