基于属性的变换(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>
...
谢谢!
答案 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应该这样做。