xpath中的这些有什么区别?

what is the difference between these in xpath?

我是 xpath 的新手,谁能告诉我 xpath 中的 /bookstore/*/bookstore 有什么区别?

假设这是示例输入

<bookstore>
    <book>
      <title lang="en">Harry Potter</title>
      <price>29.99</price>
    </book>
    <book>
      <title lang="en">Learning XML</title>
      <price>39.95</price>
    </book>
</bookstore>

<bookstore>

    <book>
      <title lang="en">Harry Potter1</title>
      <price>29.999</price>
    </book>

    <book>
      <title lang="en">Learning XML1</title>
      <price>39.955</price>
    </book>

</bookstore>

这两种情况下会输出什么? 提前致谢。

表达式 /bookstore/* 将 select 个子节点,/bookstore 将 select 节点本身。

例如,/bookstore/* 将 select /bookstore 下的所有子元素 ,因此您最终可能会得到一个元素集合。请注意,如果这是一个更复杂的表达式,如 /bookstore/book/* 并且有多个 /bookstore/book 元素,则所有匹配节点的所有子节点都是 selected.

表达式 /bookstore 将 select 只有元素 /bookstore。与上面类似,如果它沿着像 /bookstore/book.

这样的路径,这样的 select 可能会导致元素的集合

假设以下简单输入文档:

<bookstore>
   <book/>
   <book/>
</bookstore>

现在,表达式

/bookstore

表示

Select an element named bookstore, but only if it is the outermost element of the document

在格式良好的 XML1 中只能有一个最外层元素,所以上面的路径表达式只会 select 最多一个元素节点.

/bookstore/*

表示

Select an element named bookstore, but only if it is the outermost element of the document. Then, select all its immediate child elements, regardless of their name.

1 正如 Michael Kay 指出的那样,除非您以编程方式构建 XML 树。然后,可能有多个最外层元素。


then in case of /bookstore/* out put wil not contain <bookstore> and </bookstore>

我可以看到两种阅读此问题的方法。

为什么 <element></element> 都是?

<bookstore></bookstore> 视为 一个单一元素 。它们是该元素的开始和结束 tag。一旦输入文档被读入内存,它就会存储在树状结构中(例如 DOM), 没有开始和结束标签 。您评估 XPath 表达式所依据的就是这种表示。

但是,如果您输出对 XPath 表达式求值的结果,则结果树会再次序列化,并且标签会重新出现 - 这可能会造成混淆。

是否在路径 selected 中提到了所有元素?

不,在像

这样的表达式中
/bookstore/book

只有 book 个元素节点被 select 编辑。只有最右边的项目,就在最后一个 axist step 之后(例如 /parent::)被 selected.