Search code examples
xsltinsertpositionconditional-statementselement

XSLT - Insert element at a position based on value of another element at same level


<Level>
    <Name>XYZ</Name>
    <Number>456</Number>
    <DateTime>2020-03-11T08:53:00</DateTime>
 </Level>
<Level>
    <Name>ABC</Name>
    <Number>123</Number>
    <DateTime>2020-03-13T08:53:00</DateTime>
 </Level>
 <Level>
    <Name>PQR</Name>
    <Number>789</Number>
    <DateTime>2020-03-12T08:53:00</DateTime>
 </Level>

Insert a new element Value below the element only when Level/Name = ABC

So that result should be as follows:

 <Level>
    <Name>XYZ</Name>
    <Number>456</Number>
    <DateTime>2020-03-11T08:53:00</DateTime>
 </Level>
<Level>
    <Name>ABC</Name>
    <Number>123</Number>
    <Type>Value</Type>
    <DateTime>2020-03-13T08:53:00</DateTime>
 </Level>
 <Level>
    <Name>PQR</Name>
    <Number>789</Number>
    <DateTime>2020-03-12T08:53:00</DateTime>
 </Level>

thanks in advance.


Solution

  • Here's a possible solution.

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
    
      <xsl:output method="xml" indent="yes"/>
    
      <xsl:template match="Level/Number[../Name='ABC']">
        <xsl:copy-of select="."/>
        <Type>Value</Type>
      </xsl:template>
    
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
    
    </xsl:stylesheet>
    

    See it working here : https://xsltfiddle.liberty-development.net/6pS26mN/1