XPath:什么可以选择?

时间:2009-11-12 17:06:49

标签: xpath attributes element

我认为XPath表达式只能指向/选择元素或元素属性吗?

3 个答案:

答案 0 :(得分:7)

根据XPath documentation at W3C

  

评估表达式以产生一个   对象,具有以下之一   四种基本类型:

     
      
  • node-set(没有重复的无序节点集合)
  •   
  • 布尔值(true或false)
  •   
  • 数字(浮点数)
  •   
  • string(一系列UCS字符)
  •   

节点是文档树的元素,因此它们可以包括元素节点,属性节点和文本节点。请注意,XPath表达式可以选择多个节点 - 即多个元素 - 而不仅仅是一个节点。

一些例子:

  • //monkey - 将选择文档中的所有<monkey>元素,即节点集
  • count(//monkey) - 将返回所有<monkey>元素的计数,数字
  • contains("mouse", "cat") - 将返回false,布尔值
  • (//monkey)[0]/text() - 将返回第一个<monkey>元素中的文本,即字符串

答案 1 :(得分:1)

由于你可以自由使用集合运算符,你几乎可以选择任何东西。

//x | //@x
如果我正确地回忆起语法,

应该给你一个所有x元素和所有x属性的列表。 (管道是工会运营商)

答案 2 :(得分:1)

Dave Webb目前接受的答案只是部分正确

可以选择所有七种类型的节点

  • Root (文档节点),例如"/"
  • 元素,例如:"/*"
  • 属性,例如:"//@*"
  • 文字节点,例如:"//text()"
  • 评论节点,例如:"//comment()"
  • 处理指令节点,如:"//processing-instruction()"
  • 命名空间节点,例如:"//namespace::*"

此外,最好知道根据给定XPath引擎的主机,所选节点集可能包含来自多个文档的节点。例如,如果主机是XSLT,则使用以下XPath表达式:

"document($uri1)//* | document($uri2)//*"

选择$uri1标识的文档中所有元素的联合以及$uri2标识的文档中的所有元素。

所选节点集中节点的顺序是“文档顺序”(如深度优先),但这仅适用于属于同一文档的节点。如果选择了属于多个文档的节点,则不会定义属于不同文档的节点之间的顺序(取决于实现)。

最后,在XPath 2.0中,选择也可以是任何类型的项目序列(可能是混合的)(并且具有预定义的顺序),并且可能存在无限的项目类型集合(如果使用用户定义的类型) ),包括所有内置的XML Schema类型。

在XPath 2.1(W3C工作草案预计将在我们发言时发布)中,还会有一个“函数项”类型,因为函数将成为该语言的一流类型,并可作为参数传递,由函数返回,存储在序列中或动态创建。