xsl-list
[Top] [All Lists]

RE: Can one _generate_ namespace nodes?

2003-02-24 13:20:02
I've developed an interesting scheme -- with help from various folks on this 
list -- for doing something along these lines. I hope that this approach helps 
people. In addition, I have an additional problem that I need help solving.

I have a file that maps XPaths to Word styles. It is a little more complicated 
than that, but that's the basic idea. The XPaths are namespace qualified, as 
are all good XPaths.

Near the top of the mapping file, I have the following markup:

                <xmlNamespaceManager>
                        <mapping>
                                <prefix>foo</prefix>
                                <uri>http://foo</uri>
                        </mapping>
                        <mapping default="yes">
                                <prefix>xhtml</prefix>
                                <uri>http://www.w3.org/1999/xhtml</uri>
                        </mapping>
                </xmlNamespaceManager>

I then have a transform that transforms the mapping file into a transform. In 
that transform, I have the following logic:

                        <xslt:for-each select="m:xmlNamespaceManager/m:mapping">
                                <xslt:attribute name="{m:prefix}:{m:prefix}" 
namespace="{m:uri}">
                                        <xslt:value-of select="m:prefix"/>
                                </xslt:attribute>
                        </xslt:for-each>

The result of these instructions in the resultant XML file, which happens to be 
a transform is:

<xslt:transform version="1.0" foo:foo="foo" xhtml:xhtml="xhtml" 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; xmlns:foo="http://foo"; ...

I hope that helps. This discovery was certainly a big help to me.

So, on to my problem ... I'd like the make the xhtml namespace the default one 
in the document. I could generated an namespace-alias instruction, which would 
work if the xhtml content was prefixed with 'xhtml'; however, it is not 
qualified. Is there anyway that folks can see to extend this scheme to coerce a 
default namespace declaration on the root element?

It may be that my xhtml content needs to be qualified with xhtml. I believe, 
then, that the namespace aliasing trick should work. I would then do something 
like:

                        <xslt:for-each 
select="m:xmlNamespaceManager/m:mapping[(_at_)default='yes'][1]">
                                <x:namespace-alias 
stylesheet-prefix="{m:prefix}" result-prefix="#default"/>
                        </xslt:for-each>

Assuming the following:

        <xslt:namespace-alias stylesheet-prefix="x" result-prefix="xslt"/>

Hope this all makes sense ...

Thanks,

Rich

-----Original Message-----
From: G. Ken Holman [mailto:gkholman(_at_)CraneSoftwrights(_dot_)com] 
Sent: Friday, February 21, 2003 11:42 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com

At 2003-02-21 19:24 -0500, Joseph Kesselman wrote:
If anyone *does* know of
an official and reliable way to generate a namespace declaration into a 
document at a specific point

In the past I've tried unsuccessfully doing an <xsl:copy-of> from the 
stylesheet to the result as in:

<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                 xmlns:xslo="dummy"
                 version="1.0">

<xsl:namespace-alias stylesheet-prefix="xslo" result-prefix="xsl"/>

<xsl:template match="/">
   <output>
     <xsl:copy-of select="document('')/*/namespace::xslo"/>
     <xslo:embedded/>
   </output>
</xsl:template>

</xsl:stylesheet>

but though it works in XT it doesn't work in Saxon because in Saxon the dummy 
namespace URI of the copied namespace node isn't being translated.  I'm willing 
to accept either way as correct, but don't know which way that would be.

My fallback is to just add a placebo attribute to the result document element:

<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                 xmlns:xslo="dummy"
                 version="1.0">

<xsl:namespace-alias stylesheet-prefix="xslo" result-prefix="xsl"/>

<xsl:template match="/">
   <output xslo:dummy="">
     <xslo:embedded/>
   </output>
</xsl:template>

</xsl:stylesheet>

If not... well, the article goes out as "it's ugly but it works."

If adding the document element placebo is less ugly than the repeated 
declarations, and it doesn't interfere with the result (which it might ... 
I am changing the result information set by doing this and that may not be 
acceptable), then you are all set.

I hope this helps.

...................... Ken

--
Upcoming hands-on in-depth   Europe:         February 17-21, 2003
XSLT/XPath and/or XSL-FO     North America:      June 16-20, 2003

G. Ken Holman                mailto:gkholman(_at_)CraneSoftwrights(_dot_)com
Crane Softwrights Ltd.         http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0   +1(613)489-0999 (F:-0995)
ISBN 0-13-065196-6                      Definitive XSLT and XPath
ISBN 0-13-140374-5                              Definitive XSL-FO
ISBN 1-894049-08-X  Practical Transformation Using XSLT and XPath
ISBN 1-894049-10-1              Practical Formatting Using XSL-FO
Male Breast Cancer Awareness http://www.CraneSoftwrights.com/s/bc


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




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