所以我需要使用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语句的情况下执行此操作。可能会有大量的群组,群组的数量最初并不为人所知。
答案 0 :(得分:0)
以下xsl
应按照要求对您foo's
进行分组,并且您不需要烦恼keys
!我稍微修改了您的xml
(添加root
元素,并修复了groupC
的名称),并假设您想要输出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: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>
<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>
快速解释:
for-each
,迭代每个不同的bar
值一次(即&#39; groupA&#39;,&#39; groupB&#39;,&#39; groupC&#39; )groupName
,存储群组的名称(例如&#39; groupA&#39;)element
标记,为该组创建一个元素(例如
<groupA>
)for-each
,遍历所有elementFoo's
的{{1}}
条形值等于$groupName
value-of
打印出当前的@name
elementFoo
够简单吗?