在XSLT中,"当前节点"和"上下文节点"之间有什么区别?您可以在这里找到这两个术语:http://www.w3.org/TR/xslt.
你什么时候使用其中一个?你怎么参考每一个?
Pau*_*rth 71
当前节点是模板当前正在运行的任何节点.通常,这也恰好是上下文节点,但上下文节点在嵌套的XPath表达式(方括号中的部分)中具有特殊含义.在那里,它指的是当前正在测试匹配的任何节点.因此,上下文节点在XPath表达式中更改,但不在当前节点中更改.
上下文节点可以用点(.
)缩写,或者有时完全省略.这可能有点令人困惑,因为在嵌套表达式之外,点表示当前节点.(在这种情况下,当前节点恰好是上下文节点,所以有人可能会说,这是当前节点只近因,而且更为恰当称为上下文节点.但即使是规范在这里称之为当前节点).
由于dot为您提供了上下文节点,因此在嵌套的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>
Run Code Online (Sandbox Code Playgroud)
现在假设您要将其转换为LaTeX,如下所示:
foo\footnote{Batteries not included.}
bar
baz
aak\footnote{Some assembly required.}
eep
blech\footnotemark[2]
Run Code Online (Sandbox Code Playgroud)
诀窍是告诉脚注是否已被使用.如果这是您第一次遇到脚注,则需要编写\footnote
命令; 否则你想写一个\footnotemark
命令.您可以像这样使用XSL代码:
<xsl:choose>
<xsl:when test="count(preceding::*[./@fn = current()/@fn]) = 0">\footnote{...}</xsl:when>
<xsl:otherwise>\footnotemark[...]</xsl:otherwise>
</xsl:choose>
Run Code Online (Sandbox Code Playgroud)
这里我们将context-node fn
属性(从preceding::*
节点集的结果)与current-node fn
属性进行比较.(你实际上不必说./@fn
;你可以说@fn
.)
简而言之,上下文节点将您置于XPath谓词之内; 当前节点到达谓词之外,返回到当前模板正在处理的节点.
上下文节点是XPath 评估上下文的一部分,并且随每个定位步骤的不同而变化:
step1 / step2 / step3 / ...
Run Code Online (Sandbox Code Playgroud)
每个step
在哪里
axis::node-test[predicate]
Run Code Online (Sandbox Code Playgroud)
predicate
节点。axis
node-test
.
。当前节点( ) 是XSLT 处理模型的一部分:1
current()
。1尽管对于理解上下文节点和当前节点之间的基本区别并不重要,但请注意,在 XSLT 2.0 中, 评估上下文的描述已更改。当前节点和当前节点列表的概念已被上下文项、上下文位置和上下文大小的 XPath 概念所取代。
归档时间: |
|
查看次数: |
40338 次 |
最近记录: |