Satish
Satish

Reputation: 49

creating new elements in existing xml file using xslt

I'm new to xslt, Please help: i want to create new elements in existing xml file using xslt. Please find the below sample code.

Existing output:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="class.xsl"?>
<class>
<student>Jack</student>
<student>Harry</student>
<student>Rebecca</student>
<teacher>Mr. Bean</teacher>

</class>

Expected output:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="class.xsl"?>
<class>
<student>Jack</student>
<student>Harry</student>
<student>Rebecca</student>
<teacher>Mr. Bean</teacher>
<professor>SaiBaba</professor>
</class>

Upvotes: 3

Views: 8453

Answers (1)

uL1
uL1

Reputation: 2167

One of the simplest and shortest template including logic towards your question would be:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    
    <xsl:template match="@* | node()" name="identity-copy">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy> 
    </xsl:template>
    
    <xsl:template match="class">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <professor>SaiBaba</professor>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

@* matches all attributes

node() is a function to match all elements on child-axes with type

  • element
  • text-node
  • processing-instruction (PI) node
  • comment node

First template named indentity-copy is a 1:1 copy from source to output. See more infos at Wiki here.

The second template matches your element class, copies itself, and adds the element professor. Alternativ way: You can create the elements in a more strict version via XSL commands to reduce/avoid whitespace or namespace problems:

<xsl:element name="professor">
    <xsl:text>SaiBaba</xsl:text>
</xsl:element>

Upvotes: 3

Related Questions