0

转换(http://stackoverflow.com/questions/12862902/how-to-do-xslt-muenchian-grouping-with-some-null-attributes/12871809#12871809)基于属性(@group)分组,并且属性为空。最初这仅用于连接字符串,但我现在需要扩展它,以便它使用字符串作为文件位置并连接文档(如果它们被分组) - 如果没有分组,它应该使用字符串作为它获取但没有的文件不需要加入其他任何东西。变换:

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

目前 GROUPED PART 将输出:

...

<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 ,我认为我的上述建议有效。但是,您的评论表明您希望将一个常量与 each 连接起来comp,在这种情况下,您需要使用 XSLT 1.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 回答