ma3j
ma3j

Reputation: 11

XSLT sort working with numbers but not text

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

Answers (2)

ma3j
ma3j

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

Rupesh_Kr
Rupesh_Kr

Reputation: 3435

you can try this:

        <xsl:sort select="class-a" data-type="text" order="ascending"  />

Upvotes: 1

Related Questions