我需要选择一个节点,其“name”属性等于当前节点的“引用”属性。xpath选择引用的xml节点
<node name="foo" />
<node name="bar" references="foo" />
我找不到在XPATH中表达此方法的方法。有任何想法吗。我试过以下几种:
./node[@[email protected]]
./node[@name={@references}]
很明显,上面没有用。我想真正的问题在括号内。我如何表示哪个属性来自哪个节点?
我需要选择一个节点,其“name”属性等于当前节点的“引用”属性。xpath选择引用的xml节点
<node name="foo" />
<node name="bar" references="foo" />
我找不到在XPATH中表达此方法的方法。有任何想法吗。我试过以下几种:
./node[@[email protected]]
./node[@name={@references}]
很明显,上面没有用。我想真正的问题在括号内。我如何表示哪个属性来自哪个节点?
不幸的是,您尝试的是纯XPath无法实现的。无论何时开始一个新的谓词(由括号包围的部分),上下文都会变为启动谓词的节点。这意味着您无法直接比较单个谓词中两个单独元素的属性,而无需将其存储在变量中。
您使用哪种语言?您将不得不将第一个节点的“name”属性的值存储在变量中。
例如,在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[@name=//node/@references]
没错,如果这就是你想要的,那么你就不要这么想了。 –
这是非常低效的,因为嵌套的“//”操作符,应该避免。 – Tomalak
自然的解决方案:
node[@name = current()/@references]
这工作在XSLT,因为你说话“当前节点”的,这是我翻译为“XSLT上下文节点”。不需要额外的变量。
这不工作? '/ node [@ references = current()/ @ name]'(我知道这个问题有点老,但我过去常常使用可变技巧,所以认为这可能会有所帮助。) – harpo