XPath:从变量中的节点集查询属性

时间:2010-01-14 16:39:11

标签: xslt xpath

在XSL表格中,我在变量$context中有一个节点集。

如何在$ context中正确查询最顶层节点的属性?显然,如果$ context是当前节点,我只会写"@attname",但事实并非如此。目前我做$context/../@attname这对我来说看起来不太好。

修改

好的,数据。 Here is what I see in the VS

如果你想知道我是如何得到这个奇怪的东西:我UNION用一个节点,它的子节点和从不同节点选择的属性:

<xsl:with-param name="context" select=". | ../@res" />

我不完全清楚这会产生什么结果,但我可以看出它有效。突出显示的是我感兴趣的属性。

也许这会创建一个与任何东西无关的属性,如果这样做的话:|

3 个答案:

答案 0 :(得分:1)

$context/../@attname

没有多大意义。你不能在这里“向上”,因为这会带你“在”$context之外。

如果节点集包含类似的内容(单个节点)

<node attname="foo">
  <bar />
</node>

然后:

$context/@attname

如果是这样的(节点列表):

<node attname="foo">
  <bar />
</node>
<node attname="foo">
  <bar />
</node>

然后:

$context[1]/@attname

如果变量包含结果树片段(RTF),则所有这些都不起作用。在这种情况下,您需要使用名为node-set()的扩展函数。大多数XSLT处理器都提供此功能。


编辑:您的变量包含当前节点与其父节点的裸属性节点的并集:

<xsl:with-param name="context" select=". | ../@res" />

union的结果将始终按文档顺序排列,因此即使您在 XPath中的上下文节点之后选择了属性,在生成的节点集中,它将在之前 / em> - 上下文节点的父节点在文档顺序中位于上下文节点之前。

您需要$context[1]来获取属性节点,并$context[2]来获取其他节点。

我必须说这是一些奇怪的,可能是不必要的复杂变量使用。我确信有一种方法可以用一种不那么痛苦的方式来做到这一点。例如,你可以做

 <xsl:with-param name="context" select="." />

然后在被调用的模板中使用$context/../@res。这比你现在尝试的要简单得多。

此外,如果您在此处显示的<xsl:with-param><xsl:call-template>的一部分,您可以完全删除该参数。当调用模板(而不是应用)时,上下文节点不会改变,传入它是多余的。

答案 1 :(得分:0)

除了tomalak的回答,如果您确实需要传播回根目录,您可以尝试:

ancestor::*[not(..)]

很想听听你可能想要/需要这种情况的情况。

通过粘贴自己尝试:

//pet/ancestor::*[not(..)]

在此在线Xpath test tool

答案 2 :(得分:0)

当你有<xsl:with-param name="context" select=". | ../@res" />时,'res'属性是节点集(XPath 1.0)或序列(XPath 2.0)的一部分,名为'context'的变量被绑定到。使用XPath 2.0,您可以使用$context/self::attribute(res),但XPath 1.0没有可比较的表达式,因此您可以在我的视图中执行所有操作($context[1]$context/../@res)。