Reputation: 11
Given the following XML file:
<?xml version="1.0"?>
<mappings>
<mapping>
<class-a>C</class-a>
<class-b>a</class-b>
</mapping>
<mapping>
<class-a>B</class-a>
<class-b>b</class-b>
</mapping>
<mapping>
<class-a>A</class-a>
<class-b>c</class-b>
</mapping>
</mappings>
And following XSLT file:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="mappings">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="(name() = 'mapping')*class-a" data-type="text" order="ascending" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Produces this bad XML result:
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping>
<class-a>C</class-a>
<class-b>a</class-b>
</mapping>
<mapping>
<class-a>B</class-a>
<class-b>b</class-b>
</mapping>
<mapping>
<class-a>A</class-a>
<class-b>c</class-b>
</mapping>
</mappings>
Expected result is:
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping>
<class-a>A</class-a>
<class-b>c</class-b>
</mapping>
<mapping>
<class-a>B</class-a>
<class-b>b</class-b>
</mapping>
<mapping>
<class-a>C</class-a>
<class-b>a</class-b>
</mapping>
</mappings>
Mappings should be sorted alphabetically based on class-a
element values.
By using numbers in place of strings into class-a
elements of input XML:
<?xml version="1.0"?>
<mappings>
<mapping>
<class-a>3</class-a>
<class-b>a</class-b>
</mapping>
<mapping>
<class-a>2</class-a>
<class-b>b</class-b>
</mapping>
<mapping>
<class-a>1</class-a>
<class-b>c</class-b>
</mapping>
</mappings>
with either data-type="text"
or data-type="number"
in XSLT sort tag, we are getting the same expected result :
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping>
<class-a>1</class-a>
<class-b>c</class-b>
</mapping>
<mapping>
<class-a>2</class-a>
<class-b>b</class-b>
</mapping>
<mapping>
<class-a>3</class-a>
<class-b>a</class-b>
</mapping>
</mappings>
Does anybody know how to get expected result with text as well?
Upvotes: 0
Views: 446
Reputation: 11
I finally figured out how to get expected result:
<xsl:sort select="class-a[name(..) = 'mapping']" data-type="text" />
@Tomalak: thank you, you put me on the right track!
@Rupesh: your solution works well for simple cases (including the given example) but doesn't allow to sort solely <mapping>
elements if there are also other kinds of elements inside the <mappings>
tag having themselves <class-a>
subelements...
Upvotes: 1
Reputation: 3435
you can try this:
<xsl:sort select="class-a" data-type="text" order="ascending" />
Upvotes: 1