【问题标题】:Is my understanding of XPath axes correct?我对 XPath 轴的理解是否正确?
【发布时间】:2013-05-13 10:46:03
【问题描述】:

我制作了一个描述 XPath 中各个轴的信息图。但是,我不确定它们是否正确。

我对@9​​87654324@、following-siblingprecedingpreceding-sibling 感到困惑

我的图表正确吗?

原图在这里:http://imgur.com/4ekJxca (取自 Pro XML Development with Java)

这是我对我感到困惑的节点的理解:
descendant:: 选择作为上下文节点的子节点和孙子节点的节点(仅限元素和文本)。

following:: 选择未被后代选择的任何节点(仅限文本)。

following-sibling:: 上下文节点的所有“兄弟”。也就是说,文本和元素节点是与上下文节点相同的父节点的子节点,在上下文节点之后。

preceding::sibling 上下文节点的所有“兄弟”。也就是说,文本和元素节点是与上下文节点相同的父节点的子节点,在上下文节点之前。

preceeding:: 不沿ancestor:: 轴出现且未嵌套在任何元素节点中的所有节点(仅文本)。 (我确定我搞砸了)

XML

<?xml version="1.0" encoding="UTF-8"?>
    <catalog xmlns:journal="http://www.apress.com/catalog/journal" >
        <journal:journal title="XML" publisher="IBM developerWorks">
            <article journal:level="Intermediate"
            date="February-2003">
                <title>Design XML Schemas Using UML</title>
                <author>Ayesha Malik</author>
            </article>
        </journal:journal>
        <journal title="Java Technology" publisher="IBM developerWorks">
            <article level="Advanced" date="January-2004">
            <title>Design service-oriented architecture
            frameworks with J2EE technology</title>
            <author>Naveen Balani</author>
        </article>
        <article level="Advanced" date="October-2003">
            <title>Advance DAO Programming</title>
            <author>Sean Sullivan </author>
        </article>
    </journal>
</catalog>

【问题讨论】:

  • 正确。不过,这不是 Java 问题。
  • @MarkoTopolnik 检查新图像
  • 查看此页面以获得漂亮的交互式 XPath 可视化pimpmyxslt.com/axesviz.aspx
  • @MadsHansen 你不知道这对我有多大帮助。
  • 这有点令人担忧。命名空间声明可能类似于属性,但绝对不是。此外,无论如何它都没有正确的命名空间,XML 示例将命名空间提供为 http://www.apress.com/catalog/journal,而不是 w3.org 地址。

标签: xpath


【解决方案1】:

获得关于 precedingfollowing 轴的准确直觉的最佳方法是将 XML 想象为一组嵌套的框或区间,其中每个区间从开始标记延伸到其匹配的结束标记。在这张图片中,您可以看到任意两个不同的区间 ab 必须恰好处于以下关系之一:

  1. a 包含 b (a/descendant::b);
  2. a 包含在 b (a/ancestor::b) 中;
  3. a 之后是 b (a/following::b)。
  4. a 前面是 b (a/preceding::b);

如果您坚持这个模型,您将永远不会怀疑 XPath 轴的语义。

顺便说一句,这就是为什么树模型不利于您的直觉:它没有将“嵌套框”范式放在首位,因此很容易混淆。

【讨论】:

  • 所以,基本上对于preceeding:: all 之前的标签(包括嵌套元素和不包括属性和命名空间)上下文节点被选中?
  • 对于following::,任何 构成descendant:: 的一部分的内容仅排除围绕元素的未嵌套文本节点:) 不包括命名空间和属性节点是
  • 不,你的说法是错误的。 preceding::选择文档顺序节点中的前面的all。这是很多人(他们认为自己知道 XPath)都会犯的错误。
  • preceeding:: 选择属于ancestor::轴的所有内容
  • @LittleChild,只需使用 XPathVisualizer,您就会找到问题的答案。当然,阅读一本关于 XPath 的好书。至于不正确的说法——following::preceding:: 轴与 ancestor::descendant:: 轴不重叠。这在 W3C XPath 1.0 规范中有明确规定。
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 2020-03-03
  • 2010-11-07
  • 1970-01-01
相关资源
最近更新 更多