Not able to group similar records in XSLT -
i trying grouping similar records based on language. not able grouping in xslt. using xsl key function grouping record in xslt. trying loop , add together each grouping records 1 group.
i have next input xml.
<root> <element name="david" language="german"></element> <element name="sarah" language="german"></element> <element name="isaac" language="english"></element> <element name="abraham" language="german"></element> <element name="jackson" language="english"></element> <element name="deweher" language="english"></element> <element name="jonathan" language="hindi"></element> <element name="mike" language="hindi"></element> </root>
xslt:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:xs="http://www.w3.org/2001/xmlschema" exclude-result-prefixes="xs" version="1.0"> <xsl:key name="lang" match="element" use="@language"></xsl:key> <xsl:template match="/"> <root> <xsl:for-each select="key('lang',//element/@language)"> <group> <xsl:attribute name="name" select=".//@language"></xsl:attribute> <member><xsl:value-of select=".//@name"/></member> </group> </xsl:for-each> </root> </xsl:template> </xsl:stylesheet>
expected output :
<root> <group name="german"> <member>david</member> <member>sarah</member> <member>abraham</member> </group> <group name="english"> <member>isaac</member> <member>jackson</member> <member>deweher</member> </group> <group name="hindi"> <member>jonathan</member> <member>mike</member> </group> </root>
actual output :
<root> <group name="german"> <member>david</member> </group> <group name="german"> <member>sarah</member> </group> <group name="english"> <member>isaac</member> </group> <group name="german"> <member>abraham</member> </group> <group name="english"> <member>jackson</member> </group> <group name="english"> <member>deweher</member> </group> <group name="hindi"> <member>jonathan</member> </group> <group name="hindi"> <member>mike</member> </group> </root>
i getting each records separately. can please allow me know went wrong in xsl. :)
i made changes in stylesheet. should accomplish result expect:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output indent="yes"/> <xsl:key name="lang" match="element" use="@language"></xsl:key> <xsl:template match="root"> <xsl:copy> <xsl:for-each select="element[count(. | key('lang', @language)[1]) = 1]"> <group name="{@language}"> <xsl:for-each select="key('lang', @language)"> <member><xsl:value-of select="@name"/></member> </xsl:for-each> </group> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet>
the first loop selects each unique language (a node-set of size 3), , creates context inner loop. inner loop iterates through each element , selects ones have same language.
muenchian grouping may seem hard grasp, can apply template shown in this tutorial , not have think much. applied template example.
update: here solution without using for-each
loops:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output indent="yes"/> <xsl:key name="lang" match="element" use="@language"></xsl:key> <xsl:template match="root"> <xsl:copy> <xsl:apply-templates select="element[generate-id(.) = generate-id(key('lang', @language)[1])]"/> </xsl:copy> </xsl:template> <xsl:template match="element"> <group name="{@language}"> <xsl:apply-templates select="key('lang', @language)" mode="member"/> </group> </xsl:template> <xsl:template match="element" mode="member"> <member><xsl:value-of select="@name"/></member> </xsl:template> </xsl:stylesheet>
xslt xslt-1.0 xslt-grouping
No comments:
Post a Comment