这是我的输入文件的一个例子。
<root>
<!-- [...] -->
<bbb>Foo 1</bbb>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<bbb>Foo 2</bbb>
<ccc>Foo 2.1</ccc>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<bbb>Foo 3</bbb>
<ccc>Foo 3.1</ccc>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<ccc>Foo 4</ccc>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
</root>
我想按 bbb 和 ccc 元素对节点进行分组。也有可能input-xml中只有bbb或者只有ccc。
有以下条件:
- 条件 A:按“bbb”或“ccc”元素分组
- 条件B:如果“ccc”紧跟在“bbb”之后,将它们放在一起
这是我想要的输出 xml:
<root>
<group>
<header>Foo 1</header>
<groupcontent>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
</groupcontent>
</group>
<group>
<header>Foo 2</header>
<subheader>Foo 2.1</subheader>
<groupcontent>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
</groupcontent>
</group>
<group>
<header>Foo 3</header>
<subheader>Foo 3.1</subheader>
<groupcontent>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
</groupcontent>
</group>
<group>
<subheader>Foo 4</subheader>
<groupcontent>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
<aaa>xxxxxxxx</aaa>
</groupcontent>
</group>
</root>
目前我有以下 XSL。但问题是它会为每个“Foo”生成一个“组”元素。
<xsl:stylesheet>
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<output>
<xsl:for-each-group select="root/*" group-starting-with="bbb|ccc">
<group>
<xsl:apply-templates select="current-group()[self::bbb or self::ccc]"></xsl:apply-templates>
<groupcontent>
<xsl:apply-templates select="current-group()[not(self::bbb) and not (self::ccc)]"></xsl:apply-templates>
</groupcontent>
</group>
</xsl:for-each-group>
</output>
</xsl:template>
<xsl:template match="bbb">
<header><xsl:value-of select="."></xsl:value-of></header>
</xsl:template>
<xsl:template match="ccc">
<subheader><xsl:value-of select="."></xsl:value-of></subheader>
</xsl:template>
<xsl:template match="aaa">
<p><xsl:value-of select="."></xsl:value-of></p>
</xsl:template>
</xsl:stylesheet>
如何将条件 B 添加到我的 XSL。甚至可以用一个 foreach 组来解决这个问题吗?我可以将条件 B 添加到“group-starting-with”并赋予它比条件 A 更高的优先级吗?我读过一些关于你可以优先考虑模式的东西......
提前谢谢 cpt.oneeye