How to replace namespace prefix in element and attributes using xslt

I have the original xml, for example:

<SampleRequest xmlns="http://sample.com/s"
       xmlns:s1="http://sample.com/s1"
       xmlns:s2="http://sample.com/s2"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://sample.com/s schema.xsd">
<data>
<s1:customer s1:firstName="Jim" s1:lastName="Ellison"/>
<s2:address>
    123 test street
</s2:address>
</data>
</SampleRequest>

I need to convert it to the next

<SampleRequest xmlns="http://sample.com/t"
       xmlns:t1="http://sample.com/t1"
       xmlns:t2="http://sample.com/t2"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://sample.com/t targetSchema.xsd">
<data>
<t1:customer t1:firstName="Jim" t1:lastName="Ellison"/>
<t2:address>
    123 test street
</t2:address>
</data>
</SampleRequest>

both xmls have an identical scheme, but a different namespace.

I tried to use the following xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns="http://sample.com/s"
            xmlns:s1="http://sample.com/s1"
            xmlns:s2="http://sample.com/s2"
            xmlns:t1="http://sample.com/t1"
            xmlns:t2="http://sample.com/t2"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="s1 s2">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
    <SampleRequest xmlns="http://sample.com/t"
       xmlns:t1="http://sample.com/t1"
       xmlns:t2="http://sample.com/t2"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance">
            http://sample.com/t targetSchema.xsd
        </xsl:attribute>
        <xsl:copy>
             <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </SampleRequest>
</xsl:template>
<xsl:template match="s1:*"> 
    <xsl:element name="t1:{local-name()}" namespace="http://sample.com/t1">      
        <xsl:apply-templates select="* | node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="s2:*"> 
    <xsl:element name="t2:{local-name()}" namespace="http://sample.com/t2">
        <xsl:apply-templates select="* | node()"/>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

And I get the following result

<?xml version="1.0" encoding="UTF-8"?><SampleRequest xmlns="http://sample.com/t"   xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t2="http://sample.com/t2" xmlns:t1="http://sample.com/t1" xsi:schemaLocation=" http://sample.com/t targetSchema.xsd">
<t1:customer/>
<t2:address>
    123 test street
</t2:address>
</SampleRequest>

It seems that all the attributes are missing. I'm very new to XSLT, every bit helps evaluate

+3
source share
1 answer

There are two problems in your XSLT. First, where you map the elements s1 and s2, you are not trying to subsequently apply templates to any attributes. You need to replace this statement.

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

Using this statement

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

Secondly, you do not have templates to match such attributes. You need a template:

<xsl:template match="@s1:*">
    <xsl:attribute name="t1:{local-name()}">
        <xsl:value-of select="." />
    </xsl:attribute>
</xsl:template>

Try this XSLT

<xsl:stylesheet version="1.0" 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   xmlns="http://sample.com/s" 
   xmlns:s1="http://sample.com/s1" 
   xmlns:s2="http://sample.com/s2" 
   xmlns:t1="http://sample.com/t1" 
   xmlns:t2="http://sample.com/t2" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:xs="http://www.w3.org/2001/XMLSchema" 
   exclude-result-prefixes="s1 s2">

   <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

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

   <xsl:template match="/">
      <SampleRequest 
        xmlns="http://sample.com/t" 
        xmlns:t1="http://sample.com/t1" 
        xmlns:t2="http://sample.com/t2" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <xsl:attribute name="xsi:schemaLocation">http://sample.com/t targetSchema.xsd</xsl:attribute>
         <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
         </xsl:copy>
      </SampleRequest>
   </xsl:template>

   <xsl:template match="s1:*">
      <xsl:element name="t1:{local-name()}">
         <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
   </xsl:template>

   <xsl:template match="@s1:*">
      <xsl:attribute name="t1:{local-name()}">
         <xsl:value-of select="."/>
      </xsl:attribute>
   </xsl:template>

   <xsl:template match="s2:*">
      <xsl:element name="t2:{local-name()}">
         <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
   </xsl:template>

   <xsl:template match="@s2:*">
      <xsl:attribute name="t2:{local-name()}">
         <xsl:value-of select="."/>
      </xsl:attribute>
   </xsl:template>
</xsl:stylesheet>

XML :

<SampleRequest 
   xsi:schemaLocation="http://sample.com/t targetSchema.xsd" 
   xmlns:t1="http://sample.com/t1" 
   xmlns:t2="http://sample.com/t2" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:xs="http://www.w3.org/2001/XMLSchema" 
   xmlns="http://sample.com/t">
   <t1:customer t1:firstName="Jim" t1:lastName="Ellison"/>
   <t2:address> 123 test street </t2:address>
</SampleRequest>
+7

All Articles