基于重复元素名的XSLT分组
我有一个平面源结构,需要根据以下条件进行分组: 元素P2可以在P1之后出现多次。P1和以下所有P2元素直到下一次出现P1都需要分组到“位置”结构中。当下一个P1元件出现时,“位置”重复 来源示例:基于重复元素名的XSLT分组,xslt,grouping,Xslt,Grouping,我有一个平面源结构,需要根据以下条件进行分组: 元素P2可以在P1之后出现多次。P1和以下所有P2元素直到下一次出现P1都需要分组到“位置”结构中。当下一个P1元件出现时,“位置”重复 来源示例: <P1><field1/><field2/></P1> <P2><field1/><field2/><field3/></P2> <P1><field1
<P1><field1/><field2/></P1>
<P2><field1/><field2/><field3/></P2>
<P1><field1/><field2/></P1>
<P2><field1/><field2/><field3/></P2>
<P2><field1/><field2/><field3/></P2>
<P2><field1/><field2/><field3/></P2>
<P2><field1/><field2/><field3/></P2>
<P1><field1/><field2/></P1>
<P2><field1/><field2/><field3/></P2>
<P2><field1/><field2/><field3/></P2>
结果应该是:
<Position>
<P1><field1/><field2/></P1>
<P2><field1/><field2/><field3/></P2>
</Position>
<Position>
<P1><field1/><field2/></P1>
<P2><field1/><field2/><field3/></P2>
<P2><field1/><field2/><field3/></P2>
<P2><field1/><field2/><field3/></P2>
<P2><field1/><field2/><field3/></P2>
</Position>
<Position>
<P1><field1/><field2/></P1>
<P2><field1/><field2/><field3/></P2>
<P2><field1/><field2/><field3/></P2>
</Position>
我正在尝试使用轴跟随同级,但无法确定如何选择所有P2元素以进行下一次P1。或者我应该在这种情况下使用xsl:key 在XSLT2.0中,每个组的
问题很简单:
<xsl:for-each-group select="*" group-starting-with="P1">
<Position>
<xsl:copy-of select="current-group()" />
</Position>
</xsl:for-each-group>
在1.0中,我能想到的最有效的方法是定义一个键
<xsl:key name="P2key" match="P2" use="generate-id(preceding-sibling::P1[1])" />
将P2元素按其最近的前一个P1进行分组。然后仅处理P1元件,并使用钥匙拔出右侧P2:
<xsl:for-each select="P1">
<Position>
<xsl:copy-of select=". | key('P2key', generate-id())" />
</Position>
</xsl:for-each>
(就我个人而言,我会为每个
使用模板,而不是,但为每个
使用,这是一个更简单的例子)嗨,伊恩,这是你的好建议。我已经实现了你的想法,它对我非常有效:-)