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')をグループ化し、上記のサンプルXMLをXSLT2.0で以下の形式に変換したいと思います。

<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 に答える