【问题标题】:How to get parent element with attribute using xpath如何使用xpath获取具有属性的父元素
【发布时间】:2017-06-01 15:28:54
【问题描述】:

我已经发布了示例 XML 和预期的输出,请帮助获得结果。

示例 XML

<root>
  <A id="1">
    <B id="2"/>
    <C id="2"/>
  </A>
</root>

预期输出:

<A id="1"/>

【问题讨论】:

  • 是的@vitally...
  • 好的,已回答,@antony
  • 我没有得到正确的结果。

标签: xpath xquery marklogic


【解决方案1】:

您可以通过多种方式制定此查询:

  • 查找具有匹配属性的元素,一直只升序:

    //*[@id=1]
    
  • 找到属性,然后上一步:

    //@id[.=1]/..
    
  • 使用fn:id($id) 函数,假设文档已经过验证并且 ID 属性定义如下:

    /id('1')
    

【讨论】:

  • 您无法获得您要求的确切结果,因为所有 XML 元素都必须关闭。所以你能得到的最好的是&lt;a id='1' /&gt;。看来我(和其他人)错误地理解了这个问题。选择结果的规则是什么?
【解决方案2】:

我认为这不可能是你所追求的。没有办法使用 XPATH 选择没有子节点的节点(这意味着在您的情况下它总是返回节点 B 和 C)

您可以使用 XQuery 实现这一点,我不确定这是否是您想要的,但这里有一个示例,您可以根据存储在 $doc 变量中的现有节点创建一个新节点。

declare variable $doc := <root><A id="1"><B id="2"/><C id="2"/></A></root>;
element {fn:node-name($doc/*)} {$doc/*/@*}

以上返回&lt;A id="1"&gt;&lt;/A&gt;

【讨论】:

  • 这个答案解决了我认为的预期问题,但可能无法概括。也许第二行应该是for $el in $doc//*[@id="1"] return element { fn:node-name($el) } { $el/@* }
【解决方案3】:

这就是你要找的吗?

//*[@id='1']/parent::*,类似于//*[@id='1']/../

如果您想验证父级是否为 root :

//*[@id='1']/parent::root

https://en.wikipedia.org/wiki/XPath 如果您不仅需要父元素,还需要具有某些属性的前一个元素:阅读 Axis 说明符并使用 Axis "ancestor::" =)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多