XSLT/XPath中的当前节点与Context节点?

Pau*_*rth 65 xml xslt xpath

在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谓词之内; 当前节点到达谓词之外,返回到当前模板正在处理的节点.


kjh*_*hes 7

上下文节点

上下文节点是XPath 评估上下文的一部分,并且随每个定位步骤的不同而变化:

step1 / step2 / step3 / ...
Run Code Online (Sandbox Code Playgroud)

每个step在哪里

axis::node-test[predicate]
Run Code Online (Sandbox Code Playgroud)
  • 每个步骤都根据前面步骤设置的上下文节点进行评估。
  • 然后,每个步骤都会选择成为后续步骤的上下文节点的节点。
  • 评估时,上下文节点是已通过的predicate节点。axisnode-test
  • 上下文节点可以作为 访问.

当前节点

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

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

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