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

时间:2009-06-20 19:29:08

标签: xml xslt xpath

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

你什么时候使用其中一个?你怎么称呼每一个?

2 个答案:

答案 0 :(得分:70)

当前节点是模板当前正在运行的任何节点。通常,这也恰好是上下文节点,但上下文节点在嵌套的XPath表达式(方括号中的部分)中具有特殊含义。在那里,它指的是当前正在测试匹配的任何节点。因此,上下文节点在XPath表达式中更改,但不在当前节点中更改。

上下文节点可以用点(.)缩写,或者有时完全省略。这可能有点令人困惑,因为在嵌套表达式之外,点表示当前节点。 (在这种情况下,当前节点恰好是上下文节点,因此有人可能会说它只是当前节点,并且更恰当地称为上下文节点。但即使规范也将其称为当前节点。)< / p>

由于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>

现在假设您要将其转换为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-node fn属性(来自preceding::* node-set的结果)与当前节点fn属性进行比较。 (你实际上不必说./@fn;你可以说@fn。)

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

答案 1 :(得分:1)

上下文节点

上下文节点 XPath evaluation context的一部分,并且每个{ 3}}:

step1 / step2 / step3 / ...

每个step在哪里

axis::node-test[predicate]
  • 每个步骤都是相对于之前步骤设置的上下文节点进行评估的。
  • 然后,每个步骤都选择成为后续步骤的上下文节点的节点。
  • 评估predicate时,上下文节点是axis上经过node-test的节点。
  • 可以通过.访问上下文节点。

当前节点

当前节点 ()是 XSLT location step的一部分: 1

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

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