This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Carrying Namespaces through a XSL to XSL Transformation
- To: <xsl-list at lists dot mulberrytech dot com>
- Subject: Re: [xsl] Carrying Namespaces through a XSL to XSL Transformation
- From: "Kevin McCarthy" <Kevin at McCarthy dot net>
- Date: Thu, 28 Dec 2000 20:57:20 -0800
- Cc: <elenz at xyzfind dot com>
- References: <BNEMICIEADHDDOIKLHNCCEHIDAAA.elenz@xyzfind.com>
- Reply-To: xsl-list at lists dot mulberrytech dot com
Evan,
I have used the below example of xsl:text with disable-output-escaping when
applying an XSLT to an XML schema definition, to produce another XSLT. The
produced XSLT then has custom template matches, based upon the elements that
a paricular XML data file will contain. As I am working with multiple
namespaces and schema definitions, a single XSLT to generate a custom XSLT
worked well for me.
I think you have some good suggestions below, but I am not sure that they
will work for my situation.
-Kevin
----- Original Message -----
From: "Evan Lenz" <elenz@xyzfind.com>
To: <xsl-list@lists.mulberrytech.com>
Sent: Thursday, December 28, 2000 8:30 PM
Subject: RE: [xsl] Carrying Namespaces through a XSL to XSL Transformation
> I agree that disable-output-escaping should not be used in this case. The
> only defensible use of disable-output-escaping that I remember seeing is
the
> rendering of non-well-formed HTML in a browser (where the HTML markup is
> actually content, not markup).
>
> But there still is a problem here. Namespace nodes found only in the
source
> tree are only copied to the result tree when nodes from the source tree
are
> copied. If the stylesheet you're generating doesn't copy those nodes from
> the source tree, the namespace nodes won't be copied either. (When
> namespace nodes are copied, you apparently can trust the resulting
declared
> prefixes to be the same as that of the source --
> http://www.biglist.com/lists/xsl-list/archives/200010/msg00206.html)
>
> A better solution to this problem can be found by temporarily copying an
> element in the source tree for which all the desired namespace
declarations
> are in scope. Within that copied element, you can then produce the rest
of
> your stylesheet. The final step, of course, is to extract the produced
> stylesheet from this temporary root element. This requires use of the
> node-set function, or another XSLT transformation. (Incidentally, I seem
to
> remember finding that the node-set solution was extremely slower, when
using
> SAXON and a large stylesheet, than serializing, parsing, and doing another
> transformation, but that's another issue, particularly interesting with
> regard to v1.1 eliminating the need for the node-set function
> altogether--maybe Mike Kay can address this, but I continue to digress...)
>
> Here's an example that assumes all required namespace declarations will be
> found on the root element of the source tree (you can experiment with the
> three template rules provided by changing the modes):
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:saxon="http://icl.com/saxon"
> xmlns:out="http://xyzfind.com/dummy">
>
> <xsl:namespace-alias stylesheet-prefix="out"
> result-prefix="xsl"/>
>
> <!-- this one creates a temporary tree to
> propagate source tree namespace declarations -->
> <xsl:template match="/xsl:stylesheet">
> <xsl:variable name="tempTree">
> <xsl:copy>
> <out:stylesheet version="1.0">
> <!-- produce the stylesheet -->
> </out:stylesheet>
> </xsl:copy>
> </xsl:variable>
> <xsl:copy-of select="saxon:node-set($tempTree)/*/*"/>
> </xsl:template>
>
> <!-- this version works, but
> requires another transformation -->
> <xsl:template match="/xsl:stylesheet"
> mode="requiresSubsequentTransformation">
> <xsl:copy>
> <out:stylesheet version="1.0">
> <!-- produce the stylesheet -->
> </out:stylesheet>
> </xsl:copy>
> </xsl:template>
>
> <!-- this is probably what you tried that didn't work -->
> <xsl:template match="/xsl:stylesheet"
> mode="failedAttempt">
> <out:stylesheet version="1.0">
> <!-- produce the stylesheet -->
> </out:stylesheet>
> </xsl:template>
>
> </xsl:stylesheet>
>
>
> Here's the *source* document:
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:a="http://www.namespace.we.want.to.propagate">
>
> <xsl:template match="a:stuff">
> <!-- stuff -->
> </xsl:template>
>
> </xsl:stylesheet>
>
>
> Here's the (desired) result:
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:a="http://www.namespace.we.want.to.propagate"/>
>
>
> But this approach only works when you know where the namespace
declarations
> are (at the root element of the source document, in this case). It breaks
> down when you move the namespace declarations in the source around like
so:
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <xsl:template match="a:stuff"
> xmlns:a="http://www.namespace.we.wanted.to.propagate">
> <!-- stuff -->
> </xsl:template>
>
> </xsl:stylesheet>
>
>
> Again, it will only work if the nodes for which the desired namespaces are
> in scope are copied to the result.
>
> Thus, this isn't a perfect solution. For now, I'm guessing the solution
is
> to copy as much as possible (as opposed to using literal result elements)
> and test the result to make sure it worked (yuck!) It's been a while
since
> I've implemented real applications of this, so if I'm missing something,
I'd
> love to hear it! I do feel that I'm missing something...
>
> Evan Lenz
> elenz@xyzfind.com
> http://www.xyzfind.com
> XYZFind -- Repository, Search, and Query for XML
> Download our free beta software: http://www.xyzfind.com/beta
>
>
> > -----Original Message-----
> > From: owner-xsl-list@lists.mulberrytech.com
> > [mailto:owner-xsl-list@lists.mulberrytech.com]On Behalf Of Kevin
> > McCarthy
> > Sent: Wednesday, December 27, 2000 7:39 PM
> > To: xsl-list@lists.mulberrytech.com
> > Cc: chadsm@mitre.org
> > Subject: Re: [xsl] Carrying Namespaces through a XSL to XSL
> > Transformation
> >
> >
> > Chad,
> >
> > Here is a template that I have used in the past, using MSXML3.
> > This successfully outputs multiple namespace references in the resulting
> > XSLT.
> > I am using parameters in the below example to define on of my
> > namespaces and
> > schema locations.
> >
> > Good luck,
> > -Kevin
> >
> >
> >
> > <!--
> > renderXSLStylesheetStart:
> > renders the opening xsl:stylesheet tag and attrs
> > -->
> > <xsl:template name="renderXSLStylesheetStart">
> > <xsl:text disable-output-escaping="yes"><?xml
> > version="1.0"?></xsl:text>
> > <xsl:text disable-output-escaping="yes">
> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> > version="1.0"</xsl:text>
> > xmlns:s="urn:schemas-microsoft-com:xml-data"
> > xmlns:dt="urn:schemas-microsoft-com:datatypes"
> > xmlns:<xsl:value-of select="$ns"
> > />="x-schema:http://localhost/schema/<xsl:value-of select="$name"
> > />Schema.xml"
> > xmlns:editA="x-schema:http://localhost/schema/EditAttributes.xml"
>
> > </xsl:text>
> > </xsl:template>
> >
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list