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


Answers:


74

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

在这里,我们将context-nodefn属性(来自preceding::*节点集的结果)与current-nodefn属性进行比较。(您实际上不必说./@fn;您可以说@fn。)

简而言之,上下文节点将您留在XPath谓词中。当前节点到达谓词之外,回到当前模板正在处理的节点。


1
这与自轴有什么关系?
Devela

3

上下文节点

所述上下文节点是的一部分的XPath 评估上下文以及与每个不同位置的步骤

step1 / step2 / step3 / ...

其中每个step

axis::node-test[predicate]
  • 相对于前面步骤设置的上下文节点评估每个步骤。
  • 然后,每个步骤都选择要成为后续步骤的上下文节点的节点。
  • 在评估predicate中,上下文节点是沿路节点axis已经过去node-test
  • 可以通过访问上下文节点.

当前节点

所述当前节点()是一部分XSLT 处理模型1

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

1尽管对理解上下文节点和当前节点之间的基本区别无关紧要,但请注意,在XSLT 2.0 中,评估上下文的描述已更改。当前节点和当前节点列表的概念已由上下文项,上下文位置和上下文大小的XPath概念取代。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.