可以在“group-starting-with”条款上设置优先级?
问题描述:
这是我的输入文件的一个例子。可以在“group-starting-with”条款上设置优先级?
<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” 把它们一起
这是outpout的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。但问题在于,它产生了foreach“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的优先级?我读过一些关于你能给模式的优先......
THX提前 cpt.oneeye
答
保留您的样式风格,这个样式表:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<output>
<xsl:for-each-group select="root/*" group-starting-with=
"bbb|ccc[preceding-sibling::*[1][not(self::bbb)]]">
<group>
<xsl:apply-templates select=
"current-group()[self::bbb or self::ccc]"/>
<groupcontent>
<xsl:apply-templates select=
"current-group()[not(self::bbb) and not (self::ccc)]"/>
</groupcontent>
</group>
</xsl:for-each-group>
</output>
</xsl:template>
<xsl:template match="bbb">
<header>
<xsl:value-of select="."/>
</header>
</xsl:template>
<xsl:template match="ccc">
<subheader>
<xsl:value-of select="."/>
</subheader>
</xsl:template>
<xsl:template match="aaa">
<p>
<xsl:value-of select="."/>
</p>
</xsl:template>
输出:
<output>
<group>
<header>Foo 1</header>
<groupcontent>
<p>xxxxxxxx</p>
<p>xxxxxxxx</p>
<p>xxxxxxxx</p>
</groupcontent>
</group>
<group>
<header>Foo 2</header>
<subheader>Foo 2.1</subheader>
<groupcontent>
<p>xxxxxxxx</p>
<p>xxxxxxxx</p>
<p>xxxxxxxx</p>
</groupcontent>
</group>
<group>
<header>Foo 3</header>
<subheader>Foo 3.1</subheader>
<groupcontent>
<p>xxxxxxxx</p>
<p>xxxxxxxx</p>
<p>xxxxxxxx</p>
</groupcontent>
</group>
<group>
<subheader>Foo 4</subheader>
<groupcontent>
<p>xxxxxxxx</p>
<p>xxxxxxxx</p>
<p>xxxxxxxx</p>
</groupcontent>
</group>
</output>
伟大的解决方案(+1)。但是格式非常糟糕,我编辑了你的答案。请不要写:' xsl:value-of>或相同的wirth'','', ...等等。唯一的影响是代码变得非常难读,比它应该是两倍,并且需要水平滚动,没有正常的人会做... –
2010-07-27 04:57:42
嗨亚历杭德罗,再次感谢您的解决方案。它工作正常 – 2010-07-27 11:58:39
@Dimitre:感谢编辑,我只改变了分组的模式,我应该注意那些空的指令。 – 2010-07-27 12:41:52