Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPath可以跨XML的两个子树进行外键查找吗?_Xml_Xslt_Xpath_Subtree_Xslkey - Fatal编程技术网

XPath可以跨XML的两个子树进行外键查找吗?

XPath可以跨XML的两个子树进行外键查找吗?,xml,xslt,xpath,subtree,xslkey,Xml,Xslt,Xpath,Subtree,Xslkey,假设我有以下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"/> </bu

假设我有以下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是什么?

我认为这会起作用:

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

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


/root/bucket[/root/base/tent[@key=current()/tent/@key]/@color='blue'或/root/base/tent[@key=current()/tent/@key]/@color='red']

如果使用XSLT,我建议设置一个键:

<xsl:key name="tents" match="base/tent" use="@key" />
那你就可以了

key('tents', /root/bucket/tent/@key)/@color
或者,如果
$bucket
是特定的
元素

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

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

xpath适用于给定的XML,但不是通用解决方案。如果XML为:。。。剪然后它将返回所有三种颜色。这个XPath表达式根本不选择任何“bucket”节点。它选择“颜色”属性。所以这个答案是错误的。dacracot,请接受Jeni的答案,这是一个很好的答案。当前接受的答案中的XPath表达式根本没有选择任何“bucket”节点。它选择“颜色”属性。所以这个答案是错误的。达克拉科特,请接受杰尼的回答,这是一个很好的回答
key('tents', $bucket/tent/@key)/@color