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)
所以"|" 实际上,运算符不遵循节点集操作数的顺序.有没有办法可以连接节点集,以便顺序得到尊重?
这实际上不是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::