Search code examples
xmlxsltxslt-1.0xslt-2.0transformation

How to insert new element in the xml using XSLT


I am new to XSLT working on XML to XML transformation. I want to add a element in the xml depending on the condition.

I have this employee information and requirement is to add the tag inside the element for each and every employee.

**Scenario1**
<Employee>
 <Name>Check1</Name>
 <Position>
  <org>
   <orgName>COMPANY</orgName>
   <orgType>ABC</orgTyp>
  <org>
 </Position>
</Employee>

**Scenario2**
<Employee>
 <Name>Nitesh</Name>
 <Position>
  <role>Consultant</role>
 </Position>
</Employee>

**Scenario3**
<Employee>
 <Name>Nitesh</Name>
</Employee>

I wrote the below code but it is not giving me desired output.

`

<xsl:when test="not(xs:Position)">
    <xsl:copy>
        <!-- And everything inside it -->
        <xsl:apply-templates select="@* | node()"/> 
        <!-- Add node -->
        <xs:Position>
            <xs:Organization>
                <xs:Organization_Type>1<xsl:value-of select="$OrgType"/>
                </xs:Organization_Type>
                <xs:Organization_Code>2<xsl:value-of select="$OrgCode"/>
                </xs:Organization_Code>
                <xs:Organization_Name>3<xsl:value-of select="$OrgName"/>
                </xs:Organization_Name>
            </xs:Organization>
        </xs:Position>
    </xsl:copy>
</xsl:when>
<xsl:when test="xs:Position">
    <xsl:variable name="element" select="xs:Position"/>
    <xsl:choose>
        <xsl:when test="not(xs:Position/xs:Organization/xs:Organization_Type='COMPANY')">
            <xs:Organization>
                <xs:Organization_Type>1<xsl:value-of select="$OrgType"/>
                </xs:Organization_Type>
                <xs:Organization_Code>2<xsl:value-of select="$OrgCode"/>
                </xs:Organization_Code>
                <xs:Organization_Name>3<xsl:value-of select="$OrgName"/>
                </xs:Organization_Name>
            </xs:Organization>
            <xsl:copy-of select="$element"/>
        </xsl:when>
    </xsl:choose>
</xsl:when>`

Solution

  • I did not understand your attempted code - esp. since major parts of it are missing.

    I think you want to do something like:

    XSLT 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"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:variable name="default-org">
        <org>
            <orgName>default name</orgName>
            <orgType>default type</orgType>
        </org>
    </xsl:variable>
    
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="Employee[not(Position)]">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <Position>
                <xsl:copy-of select="$default-org"/>
            </Position>     
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="Position[not(org)]">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <xsl:copy-of select="$default-org"/>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    When applied to the following test input:

    XML

    <root>
       <Employee>
          <Name>A</Name>
          <Position>
             <org>
                <orgName>COMPANY</orgName>
                <orgType>ABC</orgType>
             </org>
          </Position>
       </Employee>
       <Employee>
          <Name>B</Name>
          <Position>
             <role>Consultant</role>
          </Position>
       </Employee>
       <Employee>
          <Name>C</Name>
       </Employee>
    </root>
    

    the result will be:

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
       <Employee>
          <Name>A</Name>
          <Position>
             <org>
                <orgName>COMPANY</orgName>
                <orgType>ABC</orgType>
             </org>
          </Position>
       </Employee>
       <Employee>
          <Name>B</Name>
          <Position>
             <role>Consultant</role>
             <org>
                <orgName>default name</orgName>
                <orgType>default type</orgType>
             </org>
          </Position>
       </Employee>
       <Employee>
          <Name>C</Name>
          <Position>
             <org>
                <orgName>default name</orgName>
                <orgType>default type</orgType>
             </org>
          </Position>
       </Employee>
    </root>