2009-10-17 39 views
2

我需要选择一个节点,其“name”属性等于当前节点的“引用”属性。xpath选择引用的xml节点

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

我找不到在XPATH中表达此方法的方法。有任何想法吗。我试过以下几种:

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

很明显,上面没有用。我想真正的问题在括号内。我如何表示哪个属性来自哪个节点?

回答

2

不幸的是,您尝试的是纯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] 
+0

这不工作? '/ node [@ references = current()/ @ name]'(我知道这个问题有点老,但我过去常常使用可变技巧,所以认为这可能会有所帮助。) – harpo

3

我不能完全肯定,如果这是你想要的。这使你拥有它从任何节点引用任何节点:

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

没错,如果这就是你想要的,那么你就不要这么想了。 –

+0

这是非常低效的,因为嵌套的“//”操作符,应该避免。 – Tomalak

1

自然的解决方案:

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

这工作在XSLT,因为你说话“当前节点”的,这是我翻译为“XSLT上下文节点”。不需要额外的变量。