如何连接两个节点集以使订单得到尊重?

jbe*_*rd4 4 xslt xpath xpath-2.0

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

我试图完成的是类似下面的JavaScript代码:

[o1,o2,o3].concat([o4,o5,o6])
Run Code Online (Sandbox Code Playgroud)

产量:

[o1,o2,o3,o4,o5,o6]
Run Code Online (Sandbox Code Playgroud)

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

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>
Run Code Online (Sandbox Code Playgroud)

鉴于以下输入:

<?xml version="1.0"?>
<root>
        <element id="parentTransition"/>

 <element id="childTransition"/>
</root>
Run Code Online (Sandbox Code Playgroud)

产量(使用xsltproc):

<?xml version="1.0"?>
<return>
    <parentThenChildTransitions>
        <element id="parentTransition"/><element id="childTransition"/>
    </parentThenChildTransitions>
    <childThenParentTransitions>
        <element id="parentTransition"/><element id="childTransition"/>
    </childThenParentTransitions>
</return>
Run Code Online (Sandbox Code Playgroud)

所以"|" 实际上,运算符不遵循节点集操作数的顺序.有没有办法可以连接节点集,以便顺序得到尊重?

Dim*_*hev 8

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

在XPath 1.0中,没有任何类似于"list"数据类型的东西.节点集是一个集合,没有订单.

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

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

//*[@id='parentTransition'] , //*[@id='childTransition']
Run Code Online (Sandbox Code Playgroud)

和这个计算结果为文档中的所有元件与的序列id属性'parentTransition',接着用文档中的所有元素id的属性'childTransition'

在XSLT仍然可以访问和处理在文档顺序节点不:使用例如<xsl:sort>指令-然而被处理为的结果的一组节点的<xsl:apply-templates><xsl:for-each>node-list不是一个节点集合- .

评估不按文档顺序排列的节点的另一个示例是具有 子节点或具有子节点position()函数或位于(使用反向轴)的位置步骤(XPath表达式)的谓词内的函数(例如或)<xsl:apply-templates><xsl:for-each><xsl:sort>ancesstor::preceeding::