I have the following XML document:
<?xml version="1.0" encoding="UTF-8"?>
<objects>
<object>Clutch</object>
<object>Gearbox</object>
<object>Cylinder head</object>
<object>Starter</object>
<object>Airbox</object>
<object>Inlet manifold</object>
</objects>
And the following XSLT document:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="objects">
<parts>
<xsl:apply-templates>
<xsl:sort select="object"/>
</xsl:apply-templates>
</parts>
</xsl:template>
<xsl:template match="object">
<part>
<xsl:apply-templates/>
</part>
</xsl:template>
</xsl:stylesheet>
When applied I am getting the following output as expected, but it is not being sorted:
<?xml version="1.0" encoding="UTF-8"?>
<parts>
<part>Clutch</part>
<part>Gearbox</part>
<part>Cylinder head</part>
<part>Starter</part>
<part>Airbox</part>
<part>Inlet manifold</part>
</parts>
Why is the <xsl:sort select="object"/> not being applied ?
The reason is here:
This applies templates to the children (
object) of the current node (objects) and sorts them by the string value of their firstobjectchild.However in the provided XML document an
objectdoesn’t have anyobjectchildren — so they all have the same sort-key — the empty string — and their original order isn’t changed by the sort operation.Solution:
The complete transformation becomes:
and when it is applied to the provided XML document:
the wanted, correct result is produced: