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>

我想对订单详细信息(模板/@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>
4

1 回答 1

2

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

这里:

<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>
于 2012-05-11T18:28:25.343 回答