2

変換しているタグの一部でnull(?)属性を処理しているため、標準のMeunchainグループ化とは少し異なります。nullグループを独自の個別グループとして扱い、変換された出力にグループ化された文字列を追加したいと思います。また、グループ化があった場合は、その数をカウントします。

<root>
<section>
    <subsection>
        <module>
            <comp>111</comp>
        </module>
        <module group='group01'>
            <comp>222</comp>
        </module>
        <module group='group01'>
            <comp>333</comp>
        </module>
        <module>
            <comp>444</comp>
        </module>
        <module>
            <comp>555</comp>
        </module>
    </subsection>
</section>
<section>
    <subsection>
        <module group ="group02">
            <comp>666</comp>
        </module>
        <module group ="group02">
            <comp>777</comp>
        </module>
        <module>
            <comp>888</comp>
        </module>
        <module group ="group03">
            <comp>999</comp>
        </module>
        <module group ="group03">
            <comp>101010</comp>
        </module>
    </subsection>
    <subsection>
        <module group ="group04">
            <comp>11111</comp>
        </module>
        <module group ="group04">
            <comp>121212</comp>
        </module>
        <module group ="group05">
            <comp>131313</comp>
        </module>
        <module group ="group05">
            <comp>141414</comp>
        </module>
        <module group ="group06">
            <comp>151515</comp>
        </module>
        <module group ="group06">
            <comp>161616</comp>
        </module>
        <module>
            <comp>171717</comp>
        </module>
    </subsection>
</section>

必要な出力:

<AllSections>
<section>
    <subsection>
        <page>
            <content>111</content>
        </page>
        <page>
            <content>222333</content>
            <count>2</count>
        </page>
        <page>
            <content>444</content>
        </page>
        <page>
            <content>555</content>
        </page>
    </subsection>
</section>
<section>
    <subsection>
        <page>
            <content>666777</content>
            <count>2</count>
        </page>
        <page>
            <content>888</content>
        </page>
        <page>
            <content>999101010</content>
            <count>2</count>
        </page>
    </subsection>
    <subsection>
        <page>
            <content>111111121212</content>
            <count>2</count>
        </page>
        <page>
            <content>131313141414161616</content>
            <count>3</count>
        </page>
        <page>
            <content>151515</content>
        </page>
        <page>
            <content>171717</content>
        </page>
    </subsection>
</section>

ありがとう!

4

1 に答える 1

2

グループ属性を持つ要素の場合、その属性だけでなく、親サブセクション要素内でもグループ化します。したがって、それらをグループ化するためのキーを定義することから始めることができます。

<xsl:key name="modules" match="module[@group]" use="concat(generate-id(..), '|', @group)" />

次に、モジュール要素のさまざまなケースに一致するテンプレートが必要になります。まず、グループ属性のないモジュール要素に一致するテンプレートを作成し、必要に応じて出力をフォーマットできます。

<xsl:template match="module[not(@group)]">
    <page>
        <content>
            <xsl:value-of select="comp"/>
        </content>
    </page>
 </xsl:template>

モジュールの場合、グループ属性を使用すると、この特定のモジュール要素が上記で定義されたキーのグループで最初に発生したことを確認する一致が必要になります。

<xsl:template 
  match="module
    [@group]
    [generate-id() = generate-id(key('modules', concat(generate-id(..), '|', @group))[1])]">

このテンプレート内で、キーを使用してグループ内の要素を保持する変数を簡単に定義し、子comp要素を出力するか、それらをカウントすることができます。

<xsl:variable name="modules" select="key('modules', concat(generate-id(..), '|', @group))"/>
<page>
    <content>
        <xsl:apply-templates select="$modules/comp/text()"/>
    </content>
    <count>
        <xsl:value-of select="count($modules)" />
     </count>
</page>

最後に、他のすべてのモジュール要素(つまり、グループ属性を持つが、グループの最初ではない要素)を無視して、2回出力されないようにするために、3番目のテンプレートが必要になります。(XSLTプロセッサは、このより一般的なテンプレートの前に、常により具体的なテンプレートと一致する必要があります)

<xsl:template match="module"/>

これが完全なXSLTです

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:key name="modules" match="module[@group]" use="concat(generate-id(..), '|', @group)"/>

    <xsl:template match="root">
        <AllSections>
            <xsl:apply-templates />
        </AllSections>
    </xsl:template>

    <xsl:template match="module[not(@group)]">
        <page>
            <content>
                <xsl:value-of select="comp"/>
            </content>
        </page>
    </xsl:template>

    <xsl:template match="module[@group][generate-id() = generate-id(key('modules', concat(generate-id(..), '|', @group))[1])]">
        <xsl:variable name="modules" select="key('modules', concat(generate-id(..), '|', @group))"/>
        <page>
            <content>
                <xsl:apply-templates select="$modules/comp/text()"/>
            </content>
            <count>
                <xsl:value-of select="count($modules)" />
            </count>
        </page>
    </xsl:template>

    <xsl:template match="module"/>

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

サンプルXMLに適用すると、次のように出力されます。

<AllSections>
    <section>
        <subsection>
            <page>
                <content>111</content>
            </page>
            <page>
                <content>222333</content>
                <count>2</count>
            </page>
            <page>
                <content>444</content>
            </page>
            <page>
                <content>555</content>
            </page>
        </subsection>
    </section>
    <section>
        <subsection>
            <page>
                <content>666777</content>
                <count>2</count>
            </page>
            <page>
                <content>888</content>
            </page>
            <page>
                <content>999101010</content>
                <count>2</count>
            </page>
        </subsection>
        <subsection>
            <page>
                <content>11111121212</content>
                <count>2</count>
            </page>
            <page>
                <content>131313141414</content>
                <count>2</count>
            </page>
            <page>
                <content>151515161616</content>
                <count>2</count>
            </page>
            <page>
                <content>171717</content>
            </page>
        </subsection>
    </section>
</AllSections>
于 2012-10-13T09:30:48.693 に答える