DLoysen
DLoysen

Reputation: 39

XSLT for-each with sort not working as expected

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

Answers (1)

Kirill Polishchuk
Kirill Polishchuk

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

Related Questions