Subject: Re: [xsl] Trouble with namespaces and running identity transform on XHTML From: "James J. Ramsey" <jjramsey_6x9eq42@xxxxxxxxx> Date: Wed, 10 Mar 2004 10:03:37 -0800 (PST) |
--- Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> wrote: > Hi James, > From your description, if an element is in any > namespace (XHTML or > MathML or whatever), you want to copy it. If it's > not in any > namespace, you want to create an element with the > same local name and > in the XHTML namespace. Yes, that's what I want. > To do that, you should use: > > <xsl:choose> > <xsl:when test="namespace-uri()"> > <xsl:copy> > <xsl:apply-templates select="@*|node()" /> > </xsl:copy> > </xsl:when> > <xsl:otherwise> > <xsl:element name="{name()}" > > namespace="http://www.w3.org/1999/xhtml"> > <xsl:apply-templates select="@*|node()" /> > </xsl:element> > </xsl:otherwise> > </xsl:choose> Having an explicitly declared namespace attribute in xsl:element works in xsltproc, Saxon, and Xalan, but not Sablotron, which outputs <ns_1:html xmlns:ns_1="http://www.w3.org/1999/xhtml"> <ns_2:head xmlns:ns_2="http://www.w3.org/1999/xhtml"> --snip-- </ns_2:head> </ns_1:html> and so on. As far as I can tell from the XSLT spec, this is annoying but legal. If I set the default namespace to be "http://www.w3.org/1999/xhtml" and leave off the namespace attribute, then Sablotron outputs what xsltproc, Saxon, and Xalan do, which is to not add element prefixes and just have the xmlns (pseudo?)attribute on the html element. It is hard for me to tell from the spec if this is the behavior that the XSLT spec demands, or if the processors are being merciful in not generating piles of prefixes and namespace declarations for the result elements. > The pattern "*[local-name() = 'h1']" will match any > element whose > local name (the bit after the prefix, if there is > one) is 'h1'. That > element can be in any namespace at all, it doesn't > matter. That was what I was aiming for. > If you only > want to match h1 elements in the XHTML namespace, > you should declare > the XHTML namespace with a prefix (e.g. 'h') and use > the pattern > "h:h1". Of course, if I do that, then I'd have to have exclude-result-prefixes="h" or xsl:exclude-result-prefixes="h" somewhere in the stylesheet to avoid having xmlns:h="http://www.w3.org/1999/xhtml" in the output, and as I've noticed, that doesn't work if the default namespace is set to "http://www.w3.org/1999/xhtml", which I seem to need to do to get xsl:element to produce the right output across XSLT processors. __________________________________ Do you Yahoo!? Yahoo! Search - Find what you?re looking for faster http://search.yahoo.com XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Trouble with namespaces a, Jeni Tennison | Thread | Re: [xsl] Trouble with namespaces a, Kevin Jones |
[xsl] mediaobject on titlepage, Schreifels, Mark J. | Date | RE: [xsl] Embedding html within xml, Josh Canfield |
Month |