我的理解是,尽管 XSLT 的“节点集”被称为“集”,但它们实际上是节点的有序列表(这就是每个节点与索引关联的原因)。因此我一直在尝试使用“|”运算符连接节点集,以便尊重节点的顺序。
我试图完成的任务类似于以下 JavaScript 代码:
[o1,o2,o3].concat([o4,o5,o6])
其产量:
[o1,o2,o3,o4,o5,o6]
但是,请考虑以下简化示例:
测试扁平化.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 中有sequence数据类型。序列中的任何项目都是有序的。这与文档顺序无关。此外,相同的项目(或节点)可以在序列中出现多次。
因此,在 XSLT 2.0 中,只需使用 XPath 2.0 序列连接运算符,
:
//*[@id='parentTransition'] , //*[@id='childTransition']
其计算结果为文档中所有元素的顺序id
属性'parentTransition'
后跟文档中的所有元素id
属性'childTransition'
在 XSLT 中,仍然可以访问和处理不按文档顺序的节点:例如使用<xsl:sort>
指令 - 然而,作为结果处理的节点集<xsl:apply-templates>
or <xsl:for-each>
is a node-list
-- 不是节点集。
评估不按文档顺序的节点的另一个示例 is the position()
内的功能<xsl:apply-templates>
or <xsl:for-each>
有一个<xsl:sort>
子级或在(XPath 表达式的)位置步骤的谓词内,其中使用了反向轴(例如ancesstor::
or preceeding::
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)