0

変換(http://stackoverflow.com/questions/12862902/how-to-do-xslt-muenchian-grouping-with-some-null-attributes/12871809#12871809)は、属性(@group)に基づいてグループ化します。属性がnullです。当初、これは文字列を連結するためだけのものでしたが、文字列をファイルの場所として使用し、グループ化されている場合はドキュメントを連結するように拡張する必要があります-グループ化されていない場合は、取得するファイルとして文字列を使用する必要がありますが、他のものに参加する必要はありません。変換:

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

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

<!--GROUPED PART -->
<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>

およびサンプル入力:

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

現時点での変換では、comp文字列が同じグループにある場合は連結されます...グループ化されていない部分に対してこれを行うため、文字列はファイルの場所として使用されます。

    <!-- NON GROUPED PART -->
<xsl:template match="module[not(@group)]">
    <page>
        <content>
            <xsl:variable name="var">
               <xsl:value-of select="comp"/>
            </xsl:variable>
            <xsl:copy-of select="document(concat('../myfile/', string($var)))"/>
        </content>
    </page>
</xsl:template>

現時点では、GROUPEDPARTは次のように出力します。

..。

<page>
        <content>strgin1string2</content>
        <count>2</count>
</page>

..。

私は欲しい:

..。

<page>
        <content>
         TEXT FROM FILE CALLED string1
         TEXT FROM FILE CALLED string2
        </content>
        <count>2</count>
</page>

..。

ありがとう!

4

1 に答える 1

0

完全なXMLドキュメントを取得したいだけの場合は、コードを次のように変更できます。

<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:copy-of select="document($modules/comp)"/>
        </content>
        <count>
            <xsl:value-of select="count($modules)" />
        </count>
    </page>
</xsl:template>

comp[編集]要素に完全なURLが含まれている場合、上記の提案は機能すると思います。ただし、あなたのコメントは、定数をそれぞれに連結することを示唆していますcomp。その場合、XSLT1.0では必要です。

<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:for-each select="$modules/comp">
              <xsl:copy-of select="document(concat('../myfile/', .))"/>
            </xsl:for-each>
        </content>
        <count>
            <xsl:value-of select="count($modules)" />
        </count>
    </page>
</xsl:template>

XSLT 2.0を使用すると、次のようなコンパクトな行を記述できます<xsl:copy-of select="document($modules/comp/(concat('../line/', .))"/>が、XSLT 1.0を使用すると、for-eachで実行できます。

于 2012-10-15T13:41:15.703 に答える