【问题标题】:xpath select referenced xml nodexpath 选择引用的 xml 节点
【发布时间】:2009-10-17 14:43:11
【问题描述】:

我需要选择一个“name”属性等于当前节点的“references”属性的节点。

<node name="foo" />
<node name="bar" references="foo" />

我找不到在 XPATH 中表达这一点的方法。有任何想法吗。我尝试了以下方法:

./node[@name=@references]
./node[@name={@references}]

显然以上没有奏效。我想真正的问题在括号中;如何表示哪个属性来自哪个节点?

【问题讨论】:

    标签: select xpath


    【解决方案1】:

    我不完全确定这是否是您想要的。这为您提供了从任何节点引用到它的任何节点:

    //node[@name=//node/@references]
    

    【讨论】:

    • 真的,我没想到,如果这就是你想要的。
    • 由于嵌套了"//" 运算符,这非常低效,应该避免。
    【解决方案2】:

    不幸的是,纯 XPath 无法实现您所尝试的。每当您开始一个新的谓词(用括号括起来的部分)时,上下文就会更改为开始该谓词的节点。这意味着您不能直接比较单个谓词中两个独立元素的属性,而不会将其中一个元素存储在变量中。

    您使用什么语言?您必须将第一个节点的“名称”属性的值存储在变量中。

    例如,在 XSLT 中:

    <xsl:variable name="name" select="/node[1]/@name" />
    <xsl:value-of select="/node[@references = $name]" />
    

    在 XQuery 中

    let $name := /node[1]/@name
    return /node[@references = $name]
    

    【讨论】:

    • 这不行吗? /node[@references=current()/@name](我知道这个问题有点老了,但我以前经常使用变量技巧,所以认为这可能会有所帮助。)
    【解决方案3】:

    自然解决方案:

    node[@name = current()/@references]
    

    这适用于 XSLT,因为您说的是“当前节点”,我将其翻译为“XSLT 上下文节点”。不需要额外的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多