I found a similar question to mine, but couldn't figure out a way for my issue.
I have an XML as follows
<name>
<text class="002. AB vs BC"> Sample</text>
<text class="003. DC vs BC"> Sample</text>
<text class="004. CD vs BC"> Sample</text>
<text class="005. AB vs BC"> Sample</text>
<text class="006. AB vs BC"> Sample</text>
<text class="007. EF vs BC"> Sample</text>
<text class="008. CD vs BC"> Sample</text>
<text class="009. DC vs BC"> Sample</text>
<text class="010. AB vs BC"> Sample</text>
<text class="011. EF vs BC"> Sample</text>
<text class="012. AB vs BC"> Sample</text>
</name>
And I need to group all the nodes with similar first word in class attribute as follows
<name>
<group name="AB">
<text class="002. AB vs BC"> Sample</text>
<text class="005. AB vs BC"> Sample</text>
<text class="006. AB vs BC"> Sample</text>
<text class="010. AB vs BC"> Sample</text>
<text class="012. AB vs BC"> Sample</text>
</group>
<group name="EF">
<text class="007. EF vs BC"> Sample</text>
<text class="011. EF vs BC"> Sample</text>
</group>
<group name="CD">
<text class="008. CD vs BC"> Sample</text>
<text class="004. CD vs BC"> Sample</text>
</group>
<group name="DC">
<text class="003. DC vs BC"> Sample</text>
<text class="009. DC vs BC"> Sample</text>
</group>
</name>
How to achieve this?
This is a pretty straightforward grouping problem.
If you're limited to XSLT 1.0, you need to use Muenchian Grouping.
If you're using XSLT 2.0+, you can use xsl:for-each-group.
Examples...
XSLT 1.0
Fiddle: http://xsltfiddle.liberty-development.net/94hvTyR
XSLT 3.0 (you can make this valid 2.0 if you replace the
xsl:mode
with the identity template from the 1.0 stylesheet)Fiddle: http://xsltfiddle.liberty-development.net/94hvTyR/1
Note: The output does not have the same order as your example, but I didn't see any logic to the ordering.
With XSLT-2.0 you can use
xsl:for-each-group
with these templates:Output is: