【问题标题】:Can XPath do a foreign key lookup across two subtrees of an XML?XPath 可以跨 XML 的两个子树进行外键查找吗?
【发布时间】:2010-09-13 14:37:39
【问题描述】:

假设我有以下 XML...

<root>
  <base>
    <tent key="1" color="red"/>
    <tent key="2" color="yellow"/>
    <tent key="3" color="blue"/>
  </base>
  <bucket>
    <tent key="1"/>
    <tent key="3"/>
  </bucket>
</root>

...返回“bucket”包含“red”和“blue”的 XPath 是什么?

【问题讨论】:

  • 当前接受的答案中的 XPath 表达式根本没有选择任何“桶”节点。它选择“颜色”属性。所以这个答案是错误的。 dacracot,请接受 Jeni 的回答,这是一个很好的回答

标签: xml xslt xpath subtree xslkey


【解决方案1】:

JeniT 在此处列出了相应的响应/代码。您需要在遍历 XML 文档之前创建密钥,然后针对该密钥执行匹配。

【讨论】:

    【解决方案2】:

    如果您使用 XSLT,我建议您设置一个密钥:

    <xsl:key name="tents" match="base/tent" use="@key" />
    

    然后您可以使用特定的key&lt;base&gt; 中获取&lt;tent&gt;

    key('tents', $id)
    

    那你就可以了

    key('tents', /root/bucket/tent/@key)/@color
    

    或者,如果$bucket 是一个特定的&lt;bucket&gt; 元素,

    key('tents', $bucket/tent/@key)/@color
    

    【讨论】:

      【解决方案3】:

      不漂亮。与任何查找一样,您需要使用 current():

      /root/bucket[/root/base/tent[@key = current()/tent/@key]/@color = 'blue' or /root/base/tent[@key = current()/tent /@key]/@color = '红色']

      【讨论】:

        【解决方案4】:

        我认为这会奏效:

        /root/base/tent[/root/bucket/tent/@key = @key ]/@color
        

        【讨论】:

        • xpath 适用于给定的 XML,但不是通用解决方案。如果 XML 是: ... snip ... 那么它将返回所有三种颜色。
        • 这个 XPath 表达式根本不选择任何“桶”节点。它选择“颜色”属性。所以这个答案是错误的。 dacracot,请接受 Jeni 的回答,这是一个很好的回答。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2013-02-03
        • 2021-01-24
        相关资源
        最近更新 更多