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

Posted

技术标签:

【中文标题】XSLT/XPath 中的当前节点与上下文节点?【英文标题】:Current node vs. Context node in XSLT/XPath? 【发布时间】:2010-11-04 13:46:07 【问题描述】:

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

您什么时候会使用其中一种?你如何指代每一个?

【问题讨论】:

【参考方案1】:

上下文节点

上下文节点XPath evaluation context 的一部分,并随每个 location step 变化:

step1 / step2 / step3 / ...

每个step 的位置

axis::node-test[predicate]
每个步骤都根据前面的步骤设置的上下文节点进行评估。 然后,每个步骤都会选择成为后续步骤的上下文节点的节点。 在评估predicate 时,上下文节点是沿axis 的节点,它已通过node-test。 上下文节点可以通过.访问。

当前节点

当前节点 () 是 XSLT processing model:1

当前节点是源 XML 文档中与 XSLT 模板最匹配的节点。 当前节点成为匹配模板中每个 XPath 表达式的起始上下文节点。 可以在 XPath 谓词中以 current() 的形式访问当前节点。

1虽然对于理解上下文节点和当前节点的基本区别来说意义不大,但请注意in XSLT 2.0 评估上下文的描述已经改变。当前节点和当前节点列表的概念已经被context item、上下文位置和上下文大小的XPath概念所取代。

【讨论】:

【参考方案2】:

当前节点是模板当前正在操作的任何内容。通常这也恰好是上下文节点,但上下文节点在嵌套的 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\footnoteBatteries not included.
bar

baz
aak\footnoteSome 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 谓词中;当前节点到达谓词之外,回到当前模板正在处理的节点。

【讨论】:

这与自轴有什么关系?

以上是关于XSLT/XPath 中的当前节点与上下文节点?的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 添加强制节点

如何使用 XSLT/XPath 生成逗号分隔的列表?

抓取不是其他节点后代的节点,不包括当前上下文

XSLT / XPath函数month-from-dateTime(datetime)未按预期工作

为啥当前节点中的int字段与链表中下一个节点的字符串字段相同?

詹金斯管道:代理与节点?