0

I have below sample xml data. I need to sort the elements and data at multiple levels. 1. sort has to be happend at just below the root level like <InventoryRecord><SalesInRecord><SellOutRecord> 2. sort has to be happend for all the elements in each <InventoryRecord> or <SalesInRecord> or <SellOutRecord> on fields name 3. sort has to be happend on data in <LOCATION_ID><LOCATION_ID_DB><LOCATION_NAME> fields in the each record set irrespective of record set type. here the important thing is that, for some records <LOCATION_ID> element may not available. in that case sort should happen on only <LOCATION_ID_DB><LOCATION_NAME> values.

<root>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>1</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>2</RECORD_NO>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
    <RECORD_NO>3</RECORD_NO>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>4</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>6</RECORD_NO>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</SellOutRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>2</RECORD_NO>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>4</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>5</RECORD_NO>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>8</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</InventoryRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>3</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
    <RECORD_NO>3</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>4</RECORD_NO>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>7</RECORD_NO>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</SalesInRecord>
</root>

the expected output would be.

<root>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <RECORD_NO>5</RECORD_NO>
    <RECORD_TYPE>VALID</RECORD_TYPE>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>2</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>4</RECORD_NO>
    <RECORD_TYPE>VALID</RECORD_TYPE>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>8</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</InventoryRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <RECORD_NO>7</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>4</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>3</RECORD_NO>
    <RECORD_TYPE>VALID</RECORD_TYPE>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>3</RECORD_NO>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
</SalesInRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <RECORD_NO>2</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <RECORD_NO>6</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>3</RECORD_NO>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>1</RECORD_NO>
    <RECORD_TYPE>VALID</RECORD_TYPE>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>4</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</SellOutRecord>
</root>

1 Answer 1

1

Does

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="root">
  <xsl:copy>
    <xsl:apply-templates select="*">
      <xsl:sort select="local-name()"/>
      <xsl:sort select="LOCATION_ID"/>
      <xsl:sort select="LOCATION_ID_DB"/>
      <xsl:sort select="LOCATION_NAME"/>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

<xsl:template match="SalesInRecord | SellOutRecord | InventoryRecord">
  <xsl:copy>
    <xsl:apply-templates select="*">
      <xsl:sort select="local-name()"/>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>


</xsl:stylesheet>

do what you want? I think it produces the output you posted for the input you posted.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.