gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:37:02 28 4
gpt4 key购买 nike

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

现在假设您想像这样将其转换为 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>

这里我们将上下文节点 fn 属性(来自 preceding::* 节点集的结果)与当前节点 fn 进行比较 属性。 (您实际上不必说 ./@fn;您可以只说 @fn。)

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

关于xml - XSLT/XPath 中的当前节点与上下文节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1022345/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com