这与最近发布的另一个问题有关。鉴于下面的示例XML有一个'项目'顶部的节点有多个嵌套的'项目'节点,所有节点都有一个孩子的名字'节点。项目有其他嵌套的项目'从2到7级深。底部'项目'节点是没有子项的节点'本身,但可以有其他孩子。
根据最低级别包含的文本,我想返回通往该底部元素的所有父节点(结束游戏是只有相关分支可见的树视图)。
我原以为这是解决方案:
//item[not (item) and contains(name, 'egg')]//ancestor::item
这确实会返回我想要的所有节点,但它们都处于同一级别而没有父/子关系。
这样的东西更接近但只适用于顶级'项目' node并排除包含搜索字符串的bottom元素:
//chapters/item[.//item [not (item) and contains(name, 'egg')]]
根据以下示例,我想得到:
item 1
item 1.1
item 1.1.1
item 1.1.1.1 ham and eggs
item 2
item 2.3
item 2.3.1 egg salad
以下是样本:
<?xml version="1.0" encoding="utf-8"?>
<items>
<item>
<name>item 1</name>
<other>additional text</other>
<other1>more additional text</other1>
<item>
<name>item 1.1</name>
<other>additional text</other>
<other1>more additional text</other1>
<item>
<name>item 1.1.1</name>
<other1>more additional text</other1>
<item>
<name>item 1.1.1.1 ham and eggs</name>
<other1>more additional text</other1>
</item>
</item>
</item>
<item>
<name>item 1.2</name>
<other>additional text</other>
<other1>more additional text</other1>
<item>
<name>item 1.2.1</name>
<other1>more additional text</other1>
</item>
</item>
</item>
<item>
<name>item 2</name>
<other>additional text</other>
<other1>more additional text</other1>
<item>
<name>item 2.1</name>
<other>additional text</other>
<other1>more additional text</other1>
<item>
<name>item 2.1.1</name>
<other1>more additional text</other1>
<item>
<name>item 2.1.1.1 ham and sausage</name>
<other1>more additional text</other1>
</item>
</item>
</item>
<item>
<name>item 2.2</name>
<other>additional text</other>
<other1>more additional text</other1>
<item>
<name>item 2.2.1</name>
<other>more random text</other>
<item>
<name>item 2.2.1.1 sausage</name>
<other1>more additional text</other1>
</item>
</item>
</item>
<item>
<name>item 2.3</name>
<other>additional text</other>
<other1>more additional text</other1>
<item>
<name>item 2.3.1 egg salad</name>
<other>more random text</other>
</item>
</item>
</item>
</items>
答案 0 :(得分:1)
这个基本问题:
//item[not (item) and contains(name, 'egg')]//ancestor::item
就是说,虽然我需要的所有东西都被返回,但祖先节点包含了子项&#39; item&#39;我不想要的元素和由xpath单独返回的低级元素已经存在于一个或多个祖先中。但是,它确实有足够的信息来确定我不需要的东西,显而易见的解决方案是运行xpath并有一些额外的逻辑来从节点列表中删除不需要的节点。