0

在 XSL 工作表中,我在变量中有一个节点集$context.

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

编辑

好的,数据。 这是我在 VS 中看到的

如果您想知道我是如何得到这个奇怪的东西的:我将一个节点与它的子节点和一个从不同节点中选择的属性联合起来:

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

我不完全知道由此产生的结果,但我可以看到它有效。突出显示的是我感兴趣的属性。

也许这会创建一个附加到任何东西的属性,如果这完全有意义的话:|

4

3 回答 3

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" />

联合的结果将始终按文档顺序排列,因此即使您在 XPath 中选择了上下文节点之后的属性,在结果节点集中它也会出现在之前- 上下文节点的父节点在文档中的上下文节点之前命令。

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

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

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

然后$context/../@res在被调用的模板中使用。这将比你现在尝试的更直接。

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

于 2010-01-14T16:49:56.097 回答
0

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

ancestor::*[not(..)]

很想听听您可能想要/需要这个的情况。

通过粘贴自己尝试:

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

在这个在线Xpath 测试工具中。

于 2010-01-14T16:56:32.883 回答
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)就是您所能做的。

于 2010-01-16T16:00:18.307 回答