在XSL表格中,我在变量$context
中有一个节点集。
如何在$ context中正确查询最顶层节点的属性?显然,如果$ context是当前节点,我只会写"@attname"
,但事实并非如此。目前我做$context/../@attname
这对我来说看起来不太好。
修改
好的,数据。 Here is what I see in the VS
如果你想知道我是如何得到这个奇怪的东西:我UNION用一个节点,它的子节点和从不同节点选择的属性:
<xsl:with-param name="context" select=". | ../@res" />
。
我不完全清楚这会产生什么结果,但我可以看出它有效。突出显示的是我感兴趣的属性。
也许这会创建一个与任何东西无关的属性,如果这样做的话:|
答案 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
)。