【问题标题】:Relative XPath queries iterating by 'level'按“级别”迭代的相对 XPath 查询
【发布时间】:2011-01-07 20:05:42
【问题描述】:

我正在尝试找出一个 XPath 查询字符串来执行以下操作。

给定一个这样的 XML 文档:

<root>
    <data>foo1</data>
    <irrelevant-node>
        <data>foo1</data>
    </irrelevant-node>
    <irrelevant-node />
    <data>foo2</data>
    <irrelevant-node />
    <region>
        <data>bar1</data>
        <data>bar2</data>
        <irrelevant-node />
        <region>
            <data>hello1</data>
            <irrelevant-node />
            <data>hello2</data>
            <region>
                <irrelevant-node />
                <data>world1</data>
            </region>
        </region>
        <irrelevant-node />
        <data>bar3</data>
        <irrelevant-node>
            <data>foo1</data>
        </irrelevant-node>
        <irrelevant-node />
    </region>
    <irrelevant-node />
</root>

我想获取所有未包含在 &lt;region&gt; 中的 &lt;data&gt; 节点。

然后我想抓取所有最顶层的&lt;region&gt; 节点并在它们上重复前面的过程,相对地工作。

基本上,我将根据 &lt;data&gt; 节点的内容在它们上执行多个进程 (PHP),然后替换它们。但是,&lt;region&gt; 节点充当一种范围分隔符,一旦我完成处理给定范围内的所有&lt;data&gt; 节点,我就会向下移动一个区域级别。 &lt;data&gt; 节点可能嵌套在其他不相关的节点中。

不确定 XPath 是否是解决此问题的最佳工具,我在尝试解决此问题时遇到了很多麻烦。如前所述,我使用的是 DOM 类的 PHP 实现。

【问题讨论】:

  • /root/region/irrelevant-node/data 也应该在第二次迭代中选择“bar...”data?
  • @Alejandro:没错。第一次迭代应该捕获所有foo 数据。第二个,bar。第三个hello,以此类推。
  • 好问题,+1。请参阅我的答案以获取解释和解决方案。 :)

标签: php xpath relative-path


【解决方案1】:

基本上,我将成为 执行多个进程 (PHP) 在基于它们的节点上 内容,然后替换它们。 但是,节点充当排序 范围分隔符,一旦我完成 处理给定的所有&lt;data&gt; 节点 范围,我向下移动一个区域级别。 &lt;data&gt; 节点可以嵌套在 其他不相关的节点。

使用

//data[count(ancestor::region) = $n]

其中$n 是 0、1、...、最大深度。

对于 $n 的每个值,表达式选择“级别 $n”的所有 data 元素

您可以找到“最大深度”作为每个节点选择的count(ancestor::region)+1 的最大值:

//region[not(descendant::region)]

这个最大值可以在单个 XPath 2.0 表达式中指定,但不能在单个 XPath 1.0 表达式中指定。

【讨论】:

  • 谢谢Dimitre Novatchev;我会试一试:)
  • 嗯,它似乎不起作用;声明它是一个无效的表达式。我测试了//zuq:data[count(ancestor::zuq:region = 0)](我没有提到目标节点在zuq命名空间中)并且出错了。
  • 对不起,没关系,这是你和我的错别字的集合:) 太棒了!再次感谢Dimitre
  • @TomcatExodus:对不起,我必须在我的回答中修正两个错别字。 现在是正确的。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 2020-11-20
  • 2012-01-22
  • 1970-01-01
  • 2019-02-02
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多