gpt4 book ai didi

xslt - 如何连接两个节点集以遵守顺序?

转载 作者:行者123 更新时间:2023-12-03 15:33:34 24 4
gpt4 key购买 nike

我的理解是,尽管 XSLT 的“节点集”被称为“集”,但它们实际上是节点的有序列表(这就是为什么每个节点都与一个索引相关联)。因此,我一直在尝试使用“|”运算符连接节点集,以便遵守节点的顺序。

我试图完成的是类似于以下 JavaScript 代码的内容:

[o1,o2,o3].concat([o4,o5,o6])

其中产生:
[o1,o2,o3,o4,o5,o6]

但是,请考虑以下简化示例:

testFlatten.xsl
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml"/>

<xsl:template match="/">

<xsl:variable name="parentTransition" select="//*[@id='parentTransition']"/>
<xsl:variable name="childTransition" select="//*[@id='childTransition']"/>
<xsl:variable name="parentThenChildTransitions" select="$parentTransition | $childTransition"/>
<xsl:variable name="childThenParentTransitions" select="$childTransition | $parentTransition"/>

<return>
<parentThenChildTransitions>
<xsl:copy-of select="$parentThenChildTransitions"/>
</parentThenChildTransitions>
<childThenParentTransitions>
<xsl:copy-of select="$childThenParentTransitions"/>
</childThenParentTransitions>
</return>

</xsl:template>

</xsl:stylesheet>

给定以下输入:
<?xml version="1.0"?>
<root>
<element id="parentTransition"/>

<element id="childTransition"/>
</root>

哪个产生(使用 xsltproc):
<?xml version="1.0"?>
<return>
<parentThenChildTransitions>
<element id="parentTransition"/><element id="childTransition"/>
</parentThenChildTransitions>
<childThenParentTransitions>
<element id="parentTransition"/><element id="childTransition"/>
</childThenParentTransitions>
</return>

所以“|”运算符实际上不尊重节点集操作数的顺序。有没有一种方法可以连接节点集,以便遵守顺序?

最佳答案

这实际上不是 XSLT 而是 XPath 问题。

在 XPath 1.0 中,没有任何类似于“列表”数据类型的东西。节点集是一个集合,它没有顺序。

在 XPath 2.0 中有序列数据类型。序列中的任何项目都是有序的。这与文档顺序无关。此外,同一个项目(或节点)可以在一个序列中出现多次。

因此,在 XSLT 2.0 中,只使用 XPath 2.0 序列连接运算符 , :

//*[@id='parentTransition'] , //*[@id='childTransition']

这计算为文档中具有 id 属性 'parentTransition' 的所有元素的序列,然后是具有 id 属性 'childTransition' 的文档中的所有元素

在 XSLT 中,仍然可以访问和处理不按文档顺序 的节点:例如使用 <xsl:sort> 指令——但是作为 <xsl:apply-templates><xsl:for-each> 结果处理的节点集是 node-list —— 不是节点集.

另一个不按文档顺序 求值节点的示例是 position()<xsl:apply-templates> 中的 <xsl:for-each> 函数,它们具有 <xsl:sort> 子代或位于使用反向轴(例如 ancesstor::preceeding:: )

关于xslt - 如何连接两个节点集以遵守顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4610921/

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