gpt4 book ai didi

xslt - XSL(T) 当前/上一个/下一个

转载 作者:行者123 更新时间:2023-12-05 01:22:08 25 4
gpt4 key购买 nike

我知道有 current() 函数可以在 XSL 中检索当前节点,但是有没有办法能够引用“上一个”和“下一个”节点来引用当前位置?

最佳答案

没有。当前上下文无法知道哪些节点是“下一个”或“上一个”。

这是因为,例如,当应用模板时,机制是这样的:

  1. 你做的:<xsl:apply-templates select="*" /><!-- select 3 nodes (a,b,c) -->
  2. XSLT 处理器生成要处理的节点列表 (a,b,c)
  3. 对于其中的每一个节点,XSLT 处理器选择并执行一个匹配的模板
  4. 调用模板时,current()节点已定义,position()已定义,但除此之外,模板不知道执行流程。
  5. 执行顺序取决于处理者的偏好,只要保证结果相同即可。您的(理论上的)预测对于一个处理器可能是正确的,而对于另一个处理器则是错误的。对于像 XSLT 这样无副作用的编程语言,我认为像这样的知识将是一件危险的事情(因为人们会开始依赖执行顺序)。

您可以使用 following::siblingpreceding::sibling XPath 轴,但这与知道接下来将处理哪个节点不同

编辑

上面的解释试图回答问题,但 OP 意思不同。这是关于仅对唯一节点进行分组/输出。

根据 OP 的要求,这里快速演示如何使用 XPath 轴实现分组。

XML(项目已预先排序):

<items>
<item type="a"></item>
<item type="a"></item>
<item type="a"></item>
<item type="a"></item>
<item type="b"></item>
<item type="e"></item>
</items>

XSLT

<xsl:stylesheet 
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:template match="/items">
<!-- copy the root element -->
<xsl:copy>
<!-- select those items that differ from any of their predecessors -->
<xsl:apply-templates select="
item[
not(@type = preceding-sibling::item/@type)
]
" />
</xsl:copy>
</xsl:template>

<xsl:template match="item">
<!-- copy the item to the output -->
<xsl:copy-of select="." />
</xsl:template>

</xsl:stylesheet>

输出:

<items>
<item type="a"></item>
<item type="b"></item>
<item type="e"></item>
</items>

关于xslt - XSL(T) 当前/上一个/下一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1132219/

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