Re: [xsl] xsl and schemas - getting rid of the xsi namespace

Subject: Re: [xsl] xsl and schemas - getting rid of the xsi namespace
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Thu, 11 Jul 2002 18:54:41 +0100
Hi Mario,

> I wrote an XSLT file like this
>
> <!-- copies all the nodes to the result doc -->
> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; exclude-result-prefixes="xsi">
> <xsl:output method="xml" doctype-system="myDTD.dtd"/>
>         <xsl:template match="node() | @*">
>                 <xsl:copy>
>                         <xsl:apply-templates select="node() | @*"/>
>                 </xsl:copy>
>         </xsl:template>
>
> <!-- removes @xsi:noNamespaceSchemaLocation from output -->
> <xsl:template match="@xsi:noNamespaceSchemaLocation"/>
>
> This works fine. The only problem I still have is to remove the
> namespace xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; from
> the output document, because the parser validating against the DTD
> produces the error "attribute xmlns:xsi not defined in Document Type
> Definition".

When you copy an element with xsl:copy of xsl:copy-of, it copies the
element itself and all the namespace nodes on that element. You're
copying a doc element with an namespace node for the
XMLSchema-instance namespace, so you get a namespace declaration in
the result. To avoid it, don't copy the element, instead use
xsl:element to create it; add the following template to your
stylesheet:

<xsl:template match="*" priority="-0.4">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
    <xsl:apply-templates select="node()|@*" />
  </xsl:element>
</xsl:template>

[The priority ensures that it's a higher priority than the identity
template you're currently using, and lower than the other templates
that you might have.]

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


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


Current Thread