在XSLT,就是“当前节点”和“上下文节点”之间的区别? 您可以在这里找到使用这两个词: http://www.w3.org/TR/xslt 。
你什么时候会用一个或其他? 你如何请参阅各?
在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的一部分评估上下文以及与每个不同位置的步骤 :
step1 / step2 / step3 / ...
其中每个step
是
axis::node-test[predicate]
predicate
,上下文节点是沿着节点axis
已通过node-test
。 .
。 当前节点 ()是XSLT的一部分处理模型 :1
current()
的XPath谓词内。 1虽然无关紧要理解上下文节点和当前节点之间的基本差异,请注意, 在XSLT 2.0 评估上下文的内容被变更。 当前节点和当前节点列表的概念已被替换的XPath的概念上下文项 ,上下文位置和上下文大小。