基于元素属性的XSLT分组

时间:2012-05-11 17:46:40

标签: xslt xpath xslt-2.0

我的XML文件看起来像

<templates>
    <template type="ORC">
        <field/>
    </template>
    <template type="OBR">
        <field/>
    </template>
    <template type="OBX">
        <field/>
    </template>
    <template type="OBX">
        <field/>
    </template>
    <template type="SPM">
        <field/>
    </template>
    <template type="ORC">
        <field/>
    </template>
    <template type="OBR">
        <field/>
    </template>
    <template type="OBX">
        <field/>
    </template>
    <template type="OBX">
        <field/>
    </template>
    <template type="SPM">
        <field/>
    </template>
</templates>

我想将订单详细信息(template / @ type ='ORC')分组,并使用XSLT 2.0将上面的示例XML转换为以下格式

<templates>
    <order-details>
        <template type="ORC">
            <field/>
        </template>
        <template type="OBR">
            <field/>
        </template>
        <template type="OBX">
            <field/>
        </template>
        <template type="OBX">
            <field/>
        </template>
        <template type="SPM">
            <field/>
        </template>
    </order-details>
    <order-details>
        <template type="ORC">
            <field/>
        </template>
        <template type="OBR">
            <field/>
        </template>
        <template type="OBX">
            <field/>
        </template>
        <template type="OBX">
            <field/>
        </template>
        <template type="SPM">
            <field/>
        </template>
    </order-details>
</templates>

1 个答案:

答案 0 :(得分:2)

您可以使用xsl:for-each-groupgroup-starting-with属性按照您想要的方式进行分组。

下面:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="templates">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:for-each-group select="template" 
                                group-starting-with="*[@type='ORC']">
                <order-details> 
                    <xsl:apply-templates select="current-group()"/>
                </order-details>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

当应用于输入文档时,会产生您指定的预期输出:

<templates>
   <order-details>
      <template type="ORC">
         <field/>
      </template>
      <template type="OBR">
         <field/>
      </template>
      <template type="OBX">
         <field/>
      </template>
      <template type="OBX">
         <field/>
      </template>
      <template type="SPM">
         <field/>
      </template>
   </order-details>
   <order-details>
      <template type="ORC">
         <field/>
      </template>
      <template type="OBR">
         <field/>
      </template>
      <template type="OBX">
         <field/>
      </template>
      <template type="OBX">
         <field/>
      </template>
      <template type="SPM">
         <field/>
      </template>
   </order-details>
</templates>