1

这是我的输入文件的一个例子。

<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

4

1 回答 1

2

保留您的样式表样式,此样式表:

<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>
于 2010-07-26T16:10:55.300 回答