RE: [xsl] Replacing DTD reference with xsd reference

Subject: RE: [xsl] Replacing DTD reference with xsd reference
From: Jarno.Elovirta@xxxxxxxxx
Date: Wed, 2 Apr 2003 11:20:51 +0300
Hi,

> So I have:
> 
> <?xml version="1.0"?>
> <!DOCTYPE trap SYSTEM "./trap.dtd">
> 
> <trap>
>   ....
> </trap>
> 
> The result should be:
> 
> <?xml version="1.0"?>
> <trap xmlns="mynamespace.uri" 
> 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> 	xsi:schemaLocation="mynamespace.uri trap.xsd">
>    ....
> </trap>
> 
> Because copy-of select copies also the namespace, this is not 
> an option for
> me (because I want to transform from no namespace into 
> mynamespace.uri). Is
> there a good way to do this with XSLT, or should I better use 
> a script for
> transforming my xml files ?

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                xmlns="mynamespace.uri">

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

<xsl:template match="*" priority="1">
  <xsl:element name="{name()}">
    <xsl:if test="not(parent::*)">
      <xsl:attribute name="xsi:schemaLocation"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
        <xsl:value-of select="document('')/*/namespace::*[string-length(name()) = 0]" />
        <xsl:text> trap.xsd</xsl:text>
      </xsl:attribute>      
    </xsl:if>
    <xsl:apply-templates select="@*|node()" />
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

Cheers,

Jarno - Assemblage 23: Naked (God Module RMX - 125 BPM)

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread