我正在尝试找出一个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>
我想抓住<data>
中未包含的所有<region>
个节点。
然后我想抓住所有最顶层的<region>
节点并重复上一个过程,相对工作。
基本上,我将基于其内容在<data>
节点上执行多个进程(PHP),然后替换它们。但是,<region>
节点充当一种范围分隔符,一旦我完成处理给定范围内的所有<data>
个节点,我就会向下移动一个区域级别。 <data>
个节点可以嵌套在其他不相关的节点中。
不确定XPath是否是最好的工具,而且我在解决这个问题时遇到了很多麻烦。如上所述,我正在使用DOM类的PHP实现。
答案 0 :(得分:3)
基本上,我会成为 执行许多进程(PHP) 在基于他们的节点上 内容,然后替换它们。 但是,节点充当排序 范围分隔符,一旦我完成 处理给定的所有
<data>
个节点 范围,我向下移动一个区域级别。<data>
个节点可以嵌套在其中 其他不相关的节点。
使用强>:
//data[count(ancestor::region) = $n]
其中$n
为0,1,...,max-depth。
对于$ n的每个值,表达式选择“level $ n”中的所有data
元素。
您可以找到“max-depth”作为所选节点的count(ancestor::region)+1
的最大值:
//region[not(descendant::region)]
可以在单个XPath 2.0表达式中指定此最大 ,但不能在单个XPath 1.0表达式中指定。