Reputation: 39
I'm having problems getting a very simple xsl:sort to work. I'm sure the solution is trivial but following examples from similar questions here and from other resources hasn't gotten me to a solution.
Sample XML
<Package version="1.0">
<Payload>
<Filenames>
<Filename>MDP_939529_0_20151006104742_2.tif</Filename>
<Filename>MDP_939529_0_20151006104742_3.tif</Filename>
<Filename>MDP_939529_0_20151006104742_1.tif</Filename>
</Filenames>
<DocumentType>FOO</DocumentType>
<Timestamp>2015-10-26T15:42:04.902-07:00</Timestamp>
<PayloadContext>
<Item name="Company ID">0</Item>
<Item name="Office ID">0</Item>
</PayloadContext>
</Payload>
</Package>
My XSLT is
<?xml version='1.0' ?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="xml"
version="1.0"
encoding="UTF-8"
indent="yes"
omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<!-- global template to copy everything that doesn't match the other templates -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/MDXPackage/Payload/Filenames">
<Filenames>
<xsl:for-each select="//MDXPackage/Payload/Filenames/Filename">
<xsl:sort select="Filename" data-type="text" />
<Filename>
<xsl:value-of select="//MDXPackage/Payload/Filenames/Filename"/>
</Filename>
</xsl:for-each>
</Filenames>
</xsl:template>
</xsl:stylesheet>
my result contains
<Filenames>
<Filename>MDP_939529_0_20151006104742_2.tif</Filename>
<Filename>MDP_939529_0_20151006104742_2.tif</Filename>
<Filename>MDP_939529_0_20151006104742_2.tif</Filename>
</Filenames>
instead of the desired
<Filenames>
<Filename>MDP_939529_0_20151006104742_1.tif</Filename>
<Filename>MDP_939529_0_20151006104742_2.tif</Filename>
<Filename>MDP_939529_0_20151006104742_3.tif</Filename>
</Filenames>
Thanks in advance
David
Upvotes: 1
Views: 1034
Reputation: 56172
Change to this, it will produce the desired result.
<xsl:template match="Filenames">
<xsl:copy>
<xsl:for-each select="Filename">
<xsl:sort select="." data-type="text" />
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
Upvotes: 1