如何使用XSL 1.0按内容分组元素

时间:2015-06-29 17:28:11

标签: xml xslt-1.0

所以我需要使用XSL 1.0对内容进行分组。在这个特定的用例中,我需要转换以下内容:

<elementFoo name='1'>
    <bar>groupA</bar>
</elementFoo>
<elementFoo name='2'>
    <bar>groupB</bar>
</elementFoo>
<elementFoo name='3'>
    <bar>groupC></bar>
</elementFoo>
<elementFoo name='4'>
    <bar>groupA</bar>
</elementFoo>
<elementFoo name='5'>
    <bar>groupA</bar>
</elementFoo>
<elementFoo name='6'>
    <bar>groupC></bar>
</elementFoo>

我需要它输出如下:

A组:

Foo 1

Foo 4

Foo 5

B组:

Foo 2

C组:

Foo 3

Foo 6

基本上,我需要根据特定子元素中的内容来排序,但我不完全确定如何在没有一堆if语句的情况下执行此操作。可能会有大量的群组,群组的数量最初并不为人所知。

1 个答案:

答案 0 :(得分:0)

以下xsl应按照要求对您foo's进行分组,并且您不需要烦恼keys!我稍微修改了您的xml(添加root元素,并修复了groupC的名称),并假设您想要输出xml。如果这有帮助,请告诉我:

源XML

<root>
  <elementFoo name='1'>
    <bar>groupA</bar>
  </elementFoo>
  <elementFoo name='2'>
    <bar>groupB</bar>
  </elementFoo>
  <elementFoo name='3'>
    <bar>groupC</bar>
  </elementFoo>
  <elementFoo name='4'>
    <bar>groupA</bar>
  </elementFoo>
  <elementFoo name='5'>
    <bar>groupA</bar>
  </elementFoo>
  <elementFoo name='6'>
    <bar>groupC</bar>
  </elementFoo>
</root>

XSL转换

<xsl:template match="/root">
    <root>
        <xsl:for-each select="//bar[not(.=preceding::*)]">
        <xsl:variable name="groupName" select="." />
        <xsl:element name="{$groupName}">
            <xsl:for-each select="//elementFoo[bar=$groupName]">
            <foo><xsl:value-of select="@name" /></foo>
            </xsl:for-each>
        </xsl:element>
        </xsl:for-each>
    </root>
</xsl:template>

输出XML

<root xmlns="http://www.w3.org/1999/xhtml">
  <groupA>
    <foo>1</foo>
    <foo>4</foo>
    <foo>5</foo>
  </groupA>
  <groupB>
    <foo>2</foo>
  </groupB>
  <groupC>
    <foo>3</foo>
    <foo>6</foo>
  </groupC>
</root>

快速解释:

  1. 第一个for-each,迭代每个不同的bar值一次(即&#39; groupA&#39;,&#39; groupB&#39;,&#39; groupC&#39; )
  2. 变量groupName,存储群组的名称(例如&#39; groupA&#39;)
  3. element标记,为该组创建一个元素(例如 <groupA>
  4. 第二个for-each,遍历所有elementFoo's的{​​{1}} 条形值等于$groupName
  5. 最后,value-of打印出当前的@name elementFoo
  6. 够简单吗?