在 XSLT 中,“当前节点”和“上下文节点”有什么区别?您可以在此处找到这两个术语:http://www.w3.org/TR/xslt。
您什么时候使用其中一种?你如何指代每一个?
当前节点是模板当前正在操作的任何内容。通常这恰好也是上下文节点,但上下文节点在嵌套的 XPath 表达式(方括号中的部分)中具有特殊含义。在那里,它指的是当前正在测试匹配的任何节点。因此,上下文节点在 XPath 表达式内发生变化,但不是当前节点。
上下文节点可以用点 (.
) 缩写,有时也可以完全省略。这可能有点令人困惑,因为在嵌套表达式之外,点表示当前节点。 (在这种情况下,当前节点恰好是上下文节点,所以有人可能会说它只是近似的当前节点,更恰当地称为上下文节点。但即使规范在这里也称其为当前节点。)
由于点为您提供了上下文节点,因此在嵌套的 XPath 表达式中,用户需要一种方法来引用当前节点,即当前模板正在处理的节点。您可以通过 current()
函数执行此操作。
在某些情况下,区分这两者很有用。例如,假设您有一些这样的 XML:
<a>
<b>
<c>foo<footnote fn="1"/></c>
<d>bar</d>
</b>
<b>
<c>baz</c>
<d>aak<footnote fn="2"/></d>
</b>
<b>
<c>eep</c>
<d>blech<footnote fn="2"/></d>
</b>
<footnote-message fn="1">Batteries not included.</footnote>
<footnote-message fn="2">Some assembly required.</footnote>
</a>
现在假设您想像这样将其转换为 LaTeX:
foo\footnote{Batteries not included.}
bar
baz
aak\footnote{Some assembly required.}
eep
blech\footnotemark[2]
诀窍是判断脚注是否已被使用。如果这是您第一次遇到脚注,您想编写一个 \footnote
命令;否则你想写一个 \footnotemark
命令。您可以像这样使用 XSL 代码:
<xsl:choose>
<xsl:when test="count(preceding::*[./@fn = current()/@fn]) = 0">\footnote{...}</xsl:when>
<xsl:otherwise>\footnotemark[...]</xsl:otherwise>
</xsl:choose>
在这里,我们将上下文节点 fn
属性(来自 preceding::*
节点集的结果)与当前节点 fn
属性进行比较。 (您实际上不必说 ./@fn
;您可以只说 @fn
。)
简而言之,上下文节点将您留在 XPath 谓词中;当前节点到达谓词之外,回到当前模板正在处理的节点。
上下文节点
上下文节点 是 XPath evaluation context 的一部分,并随每个 location step 变化:
step1 / step2 / step3 / ...
其中每个 step
是
axis::node-test[predicate]
每个步骤都根据前面步骤设置的上下文节点进行评估。
然后每个步骤选择成为后续步骤的上下文节点的节点。
在评估谓词时,上下文节点是已通过节点测试的沿轴的节点。
上下文节点可以作为 ..
当前节点
当前节点 () 是 XSLT processing model 的一部分:1
当前节点是源 XML 文档中与 XSLT 模板最匹配的节点。
当前节点成为匹配模板中每个 XPath 表达式的起始上下文节点。
当前节点可以作为 XPath 谓词中的 current() 访问。
1虽然对于理解上下文节点和当前节点之间的基本区别来说意义不大,但请注意in XSLT 2.0 评估上下文的描述已更改。当前节点和当前节点列表的概念已被 context item、上下文位置和上下文大小的 XPath 概念所取代。