gpt4 book ai didi

xslt 位置总是返回 1

转载 作者:行者123 更新时间:2023-12-01 05:19:34 24 4
gpt4 key购买 nike

我有以下模板:

<xsl:template match="/">
<Envelopes>
<xsl:variable name="var1" select="ExtObj:GetXml()"/>
<xsl:apply-templates select="$var1/*"/>
</Envelopes>
</xsl:template>

<xsl:template match='xyz/abc'>
<xsl:variable name="pos" select="position()"/>
</xsl:template>

现在 $var1具有与第二个模板匹配的元素,但 $pos always 设置为 1。我怎样才能得到比赛的位置?

最佳答案

position()函数本质上是上下文敏感的 - 它为您提供当前节点在 apply-templates 选择的节点集中的位置这导致此模板触发。所以这取决于 $var1变量包含。如 $var1是一个包含 xyz 的节点集元素,每个元素都有一个 abc child ,然后 $var1/*将选择所有 abc一次性元素:

<xyz>        <!-- $var1    -->
<abc/> <!-- $var1/* -->
</xyz>
<xyz> <!-- $var1 -->
<abc/> <!-- $var1/* -->
</xyz>

(空白文本节点和注释仅用于说明,假设真正的 XML 树仅包含元素节点),您将获得 position()您期望的值。

但如果 $var1是 XPath 数据模型中的单个根节点(例如文档片段),它具有 xyz元素作为其子元素,然后 $var1/*将选择 xyz元素,而不是 abc那些。
             <!-- $var1  (the root node)  -->
<xyz> <!-- $var1/* -->
<abc/>
</xyz>
<xyz> <!-- $var1/* -->
<abc/>
</xyz>

现在,当您将模板应用于这些时,隐式默认模板将匹配它们,并且对于每个模板,它将递归调用 apply-templates在该节点的子节点(单个 abc 元素)上。所以现在 position()会给你 abc的位置在其 parent 的 child 的集合中,这将始终为 1。

如果这是正在发生的事情,那么最简单的解决方法就是说
<xsl:apply-templates select="$var1/*/*"/>

选择所有 abc元素一口气。

关于xslt 位置总是返回 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17551098/

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