xsl-list
[Top] [All Lists]

Namespaces and the identity transform

2002-10-17 10:01:16
I have a simple document:
<?xml version="1.0"?>
<doc>
<body>
        <div id="header">
                <h1>TakePart</h1>
        </div>
</body>
</doc>

I want to produce a strict xhtml document and use the following stylesheet:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns="http://www.w3.org/1999/xhtml";>
<xsl:output method="xml"
        doctype-public="-//W3C//DTD XHTML 1 Strict//EN"
        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

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

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

What I get is
<?xml version="1.0" encoding="UTF-16"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
<html xmlns="http://www.w3.org/1999/xhtml";>
        <body xmlns="">
                <div id="header"><h1>TakePart</h1></div>
        </body>
</html>

This is correct, since the html output element has the default namespace,
whereas the body element outputted through the identity transform has no
namespace.  I get the null namespace on any elements passing through the
identity transform.

How can I design an identity transform that applies the default namespace to
the output?  I prefer not to have to restructure my input, and I want all
output nodes to use the strict xhtml namespace.  I substituted the above
identity transform with the following and this seems to produce the correct
output, but is this the most efficient way of doing it?

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

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


Many thanks,

James Carlyle


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



<Prev in Thread] Current Thread [Next in Thread>