来自分组转换的XSLT Concat html文档

时间:2012-10-15 12:51:58

标签: xslt xslt-1.0

基于属性的变换(http://stackoverflow.com/questions/12862902/how-to-do-xslt-muenchian-grouping-with-some-null-attributes/12871809#12871809)组)该属性为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字符串属于同一组,则此刻的转换将汇总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>

...

谢谢!

1 个答案:

答案 0 :(得分: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>

[edit]如果comp元素包含完整的网址,我认为我的建议有效。然而,您的评论建议您希望将常量与每个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应该这样做。