xquery过滤属性和元素

gen*_*ion 8 xpath xquery

我有以下简单的XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car>
        <data attrib="Make">
            <text>Volvo</text>
        </data>
        <data attrib="Model">
            <text>855</text>
        </data>
    </car>
    <car>
        <data attrib="Make">
            <text>Volvo</text>
        </data>
        <data attrib="Model">
            <text>745</text>
        </data>
    </car>
    <car>
        <data attrib="Make">
            <text>Volvo</text>
        </data>
        <data attrib="Model">
            <text>V70R</text>
        </data>
    </car>
</cars>
Run Code Online (Sandbox Code Playgroud)

以下XPath:

/cars/car/data[(@attrib='Model') and (text='855')]
Run Code Online (Sandbox Code Playgroud)

这将返回以下结果:

<data attrib="Model"><text>855</text></data>
Run Code Online (Sandbox Code Playgroud)

我希望XPath返回<car>匹配的整个块.

所以返回数据将是这样的:

<cars>
    <car>
        <data attrib="Make">
            <text>Volvo</text>
        </data>
        <data attrib="Model">
            <text>855</text>
        </data>
    </car>
</cars>
Run Code Online (Sandbox Code Playgroud)

我如何修改上面的XPath表达式来实现这一目标?

Utk*_*nos 14

XPath会返回你要去的任何节点 - 在你要去的情况下data,这就是你要回来的东西.如果你想要car,请在之后放置谓词car.

/cars/car[data/@attrib='Model' and data/text='855']
Run Code Online (Sandbox Code Playgroud)

或者,稍短

/cars/car[data[@attrib='Model' and text='855']]
Run Code Online (Sandbox Code Playgroud)

您可以在此XMLPlayground上运行它.

XQuery生成所需的输出:

<cars>
  {/cars/car[data[@attrib='Model' and text='855']]}
</cars>
Run Code Online (Sandbox Code Playgroud)

  • 只是添加到此响应:这将返回选定的"car"元素.它不会根据要求将其包装在"cars"元素中.因为输入不包含只有一个子节点的现有"cars"元素,所以你只能通过构造一个新的"cars"元素来实现这个输出,为此你需要XQuery而不是XPath. (2认同)