Subject: Re: [xsl] Default namespace in result document From: Geert Josten <Geert.Josten@xxxxxxxxxxx> Date: Wed, 07 Dec 2005 21:24:17 +0100 |
I have been using XSLT successfully for a few years now but have never tried to make namespaces work, mainly because at least one component in the system has not supported them properly. I've now tried using them for the first time and although I get a result document that is correct it's not quite what I had expected. Here's an example:
[XML input:]
<?xml version="1.0"?> <foo xmlns="http://example.com/foo"> <blah/> </foo>
[XSLT:]
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:foo="http://example.com/foo">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/"> <foo:root> <xsl:apply-templates mode="copy"/> </foo:root> </xsl:template>
<xsl:template match="*" mode="copy"> <xsl:copy> <xsl:apply-templates mode="copy"/> </xsl:copy> </xsl:template>
</xsl:stylesheet>
So the stylesheet contains literal result elements in namespace foo, and also copies elements from the input XML that are in namespace foo. I was hoping to get something like this:
<?xml version="1.0"?> <root xmlns="http://example.com/foo"> <foo> <blah/> </foo> </root>
i.e. the default namespace is defined on the root element, and no namespace things are used anywhere else. But instead, using libxslt version 1.1.15, I get this:
<?xml version="1.0"?> <foo:root xmlns:foo="http://example.com/foo"> <foo xmlns="http://example.com/foo"> <blah/> </foo> </foo:root>
This is not ideal because it makes files much larger than they need to be. I guessed that there would be some xsl:output attribute to select a default namespace but I can't see anything that does exactly this. I can't help feeling that I've missed something obvious. Can someone suggest what I need to do?
(I assume that this is also an issue for people trying to generate "HTML-compatible XSLT" - not something I have tried to do yet...)
Use a default namespace in the stylesheet, eg:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns="http://example.com/foo">
(note the foo prefix has been removed)
This puts all literal result elements in that namespace, so you would need to remove the prefixes.
This creates the result:
<?xml version="1.0" encoding="utf-8"?> <root xmlns="http://example.com/foo"> <foo>
<blah/>
</foo> </root>
...which I think is what you are after.
cheers andrew
-- Drs. G.P.H. Josten Consultant
Daidalos BV Source of Innovation Hoekeindsehof 1-4 2665 JZ Bleiswijk Tel: +31 (0) 10 850 1200 Fax: +31 (0) 10 850 1199 www.daidalos.nl
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Default namespace in resu, andrew welch | Thread | [xsl] Output Before DOCTYPE?, Michael B Allen |
[xsl] Output Before DOCTYPE?, Michael B Allen | Date | [xsl] Attribute value (...when fals, Horace Burke |
Month |