Joshua Chris
Joshua Chris

Reputation: 15

How to remove the rootnodes using XSLT?

Input file:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:root xmlns:ns0="http://xyz.com/separate">
    <ns0:root1>
        <ns3:Detail xmlns:ns3="http://POProject/Details">
        <DetailLines>
                <ItemID>
                <ItemDescription/>
            </DetailLines>
        </ns3:Detail>
    </ns0:root1>
</ns0:root>

Output file:

<?xml version="1.0" encoding="UTF-8"?>
        <ns0:Detail xmlns:ns0="http://POProject/Details">
        <DetailLines>
                <ItemID>
                <ItemDescription/>
            </DetailLines>
        </ns0:Detail>

Question: I have to remove the root1 and root nodes and need to do small changes in Detail node. How to write a xslt code to achieve this?

Upvotes: 1

Views: 147

Answers (1)

Sean B. Durkin
Sean B. Durkin

Reputation: 12729

This...

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns0="http://xyz.com/separate"
  xmlns:ns3="http://POProject/Details">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />

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

<xsl:template match="/">
  <xsl:apply-templates select="*/*/ns3:Detail" />
</xsl:template>

<xsl:template match="ns3:Detail">
  <xsl:apply-templates select="." mode="copy-sans-namespace" />
</xsl:template>

<xsl:template match="*" mode="copy-sans-namespace">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates mode="copy-sans-namespace" />
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

...will yield this...

<?xml version="1.0" encoding="utf-8"?>
<ns3:Detail xmlns:ns3="http://POProject/Details">
  <DetailLines>
    <ItemID />
    <ItemDescription />
  </DetailLines>
</ns3:Detail>

I'm not sure it is possible to control the prefix. The XDM data model does not consider it to be significant information.


UDPATE

To get the prefix rename, I thought you would have to go to an XML 1.1 supporting XSLT processor (allowing prefix undefine), but I found a way to do it with XML 1.0 . Try this ...

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns0="http://xyz.com/separate">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />

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

<xsl:template match="/" xmlns:ns3="http://POProject/Details">
  <xsl:apply-templates select="*/*/ns3:Detail" />
</xsl:template>

<xsl:template match="ns0:Detail" xmlns:ns0="http://POProject/Details">
  <ns0:Detail xmlns:ns0="http://POProject/Details">
    <xsl:apply-templates select="*" mode="copy-sans-namespace" />
  </ns0:Detail>  
</xsl:template>

<xsl:template match="*" mode="copy-sans-namespace">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates mode="copy-sans-namespace" />
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

Upvotes: 1

Related Questions