是否可以执行自下而上的xpath查询,该查询仅返回已连接的父节点

时间:2016-05-30 15:34:00

标签: xml xpath

这与最近发布的另一个问题有关。鉴于下面的示例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>

1 个答案:

答案 0 :(得分:1)

这个基本问题:

//item[not (item) and contains(name, 'egg')]//ancestor::item

就是说,虽然我需要的所有东西都被返回,但祖先节点包含了子项&#39; item&#39;我不想要的元素和由xpath单独返回的低级元素已经存在于一个或多个祖先中。但是,它确实有足够的信息来确定我不需要的东西,显而易见的解决方案是运行xpath并有一些额外的逻辑来从节点列表中删除不需要的节点。