Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT/XPath中的当前节点与上下文节点?_Xml_Xslt_Xpath - Fatal编程技术网

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

Xml XSLT/XPath中的当前节点与上下文节点?,xml,xslt,xpath,Xml,Xslt,Xpath,在XSLT中,“当前节点”和“上下文节点”之间有什么区别?您可以在此处找到这两个术语: 你什么时候会用其中一个?如何引用每个节点?当前节点是模板当前操作的对象。通常情况下,这也是上下文节点,但上下文节点在嵌套XPath表达式(方括号中的部分)中具有特殊含义。在这里,它指的是当前正在测试匹配的任何节点。因此,上下文节点在XPath表达式中发生更改,而不是在当前节点中 上下文节点可以用点()缩写,有时也可以完全省略。这可能有点混乱,因为在嵌套表达式之外,点表示当前节点。(在这种情况下,当前节点恰好是

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


你什么时候会用其中一个?如何引用每个节点?

当前节点是模板当前操作的对象。通常情况下,这也是上下文节点,但上下文节点在嵌套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>
foo\footnote{Batteries not included.}
bar

baz
aak\footnote{Some assembly required.}

eep
blech\footnotemark[2]
<xsl:choose>
    <xsl:when test="count(preceding::*[./@fn = current()/@fn]) = 0">\footnote{...}</xsl:when>
    <xsl:otherwise>\footnotemark[...]</xsl:otherwise>
</xsl:choose>
诀窍在于判断脚注是否已经被使用。如果这是您第一次遇到脚注,您需要编写一个
\footnote
命令;否则,您需要编写一个
\footnotemark
命令。您可以使用如下XSL代码:

<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>
foo\footnote{Batteries not included.}
bar

baz
aak\footnote{Some assembly required.}

eep
blech\footnotemark[2]
<xsl:choose>
    <xsl:when test="count(preceding::*[./@fn = current()/@fn]) = 0">\footnote{...}</xsl:when>
    <xsl:otherwise>\footnotemark[...]</xsl:otherwise>
</xsl:choose>

\脚注{…}
\脚注标记[…]
这里我们比较上下文节点
fn
属性(来自前面的
节点集的结果:*
节点集)和当前节点
fn
属性。(实际上你不必说
/@fn
;你可以说
@fn

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

上下文节点 上下文节点XPath的一部分,每个节点都有所不同:

其中每个
步骤都是

axis::node-test[predicate]
  • 每个步骤都会根据前面步骤设置的上下文节点进行计算
  • 然后,每个步骤选择成为以下步骤的上下文节点的节点
  • 在计算
    谓词
    时,上下文节点是沿
    的节点,该节点已通过
    节点测试
  • 可以通过
    访问上下文节点

当前节点 当前节点是XSLT的一部分:1

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


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

这与自轴有何关系?