XSLT / XPath中的当前节点与上下文节点?

在XSLT中,“当前节点”和“上下文节点”有什么区别? 你可以在这里find两个术语: http : //www.w3.org/TR/xslt 。

你什么时候使用一个或另一个? 你如何参考每个?

当前节点是当前正在运行的模板。 通常情况下,这恰好也是上下文节点,但上下文节点在嵌套的XPathexpression式(方括号中的部分)中有特殊含义。 在那里,它指的是当前正在testing哪个节点进行匹配。 因此,上下文节点在XPathexpression式内变化,但不是当前节点。

上下文节点可以用点( . )缩写或者有时完全省略。 这可能有点令人困惑,因为在嵌套expression式之外,点表示当前节点。 (在这种情况下,当前节点恰好是上下文节点,所以可以说它只是当前节点的接近,而更恰当地称为上下文节点,但是即使规范也称它为当前节点)。

由于点为您提供了上下文节点,因此在嵌套的XPathexpression式中,用户需要引用回当前节点的方式,当前节点正在由当前模板处理。 你可以通过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谓词中; 当前节点到达谓词之外,返回到当前模板正在处理的节点。