<root> <element> <id>1</id> <group>first</group> </element> <element> <id>2</id> <group>second</group> </element> <element> <id>3</id> <group>first</group> </element> ... <root>
我如何按xslt 1.0中的组名分组我的元素.
输出:
<root> <group name="first"> <element> <id>1</id> <group>first</group> </element> <element> <id>3</id> <group>first</group> </element> </group> <group name="second"> <element> <id>2</id> <group>second</group> </element> </group> </root>
有任何想法吗?
这是Muenchian Grouping的工作.您将在StackOverflow中的XSLT标签中提供许多示例.
首先,您需要定义一个键来帮助您分组
<xsl:key name="groups" match="group" use="."/>
这将查找给定组名称的组元素.
接下来,您需要匹配每个distince组名称的所有出现的第一个实例.这是用这个可怕的陈述完成的
<xsl:apply-templates select="element/group[generate-id() = generate-id(key('groups',.)[1])]"/>
即匹配组元素,恰好是我们的密钥中该元素的第一次出现.
当您匹配不同的组节点时,您可以循环使用相同名称的所有其他组节点(其中$currentGroup是保存当前组名称的变量)
<xsl:for-each select="key('groups',$currentGroup)">
总而言之,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:key name="groups" match="group" use="."/> <xsl:template match="/root"> <root> <xsl:apply-templates select="element/group[generate-id() = generate-id(key('groups',.)[1])]"/> </root> </xsl:template> <xsl:template match="group"> <xsl:variable name="currentGroup" select="."/> <group> <xsl:attribute name="name"> <xsl:value-of select="$currentGroup"/> </xsl:attribute> <xsl:for-each select="key('groups',$currentGroup)"> <element> <id> <xsl:value-of select="../id"/> </id> <name> <xsl:value-of select="$currentGroup"/> </name> </element> </xsl:for-each> </group> </xsl:template> </xsl:stylesheet>
将其应用于您的示例XML,具有以下结果
<root> <group name="first"> <element> <id>1</id> <name>first</name> </element> <element> <id>3</id> <name>first</name> </element> </group> <group name="seccond"> <element> <id>2</id> <name>seccond</name> </element> </group> </root>