基于重复元素名的XSLT分组

基于重复元素名的XSLT分组,xslt,grouping,Xslt,Grouping,我有一个平面源结构,需要根据以下条件进行分组: 元素P2可以在P1之后出现多次。P1和以下所有P2元素直到下一次出现P1都需要分组到“位置”结构中。当下一个P1元件出现时,“位置”重复 来源示例: <P1><field1/><field2/></P1> <P2><field1/><field2/><field3/></P2> <P1><field1

我有一个平面源结构,需要根据以下条件进行分组:

元素P2可以在P1之后出现多次。P1和以下所有P2元素直到下一次出现P1都需要分组到“位置”结构中。当下一个P1元件出现时,“位置”重复

来源示例:

    <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>


(就我个人而言,我会为每个
使用模板,而不是
,但为每个
使用
,这是一个更简单的例子)

嗨,伊恩,这是你的好建议。我已经实现了你的想法,它对我非常有效:-)