$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>
则可以完全删除该参数。当调用(而不是应用)模板时,上下文节点不会更改,将其传入是多余的。