RE: [xsl] Literal result element namespace differs from xsl:element namespace

Subject: RE: [xsl] Literal result element namespace differs from xsl:element namespace
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Wed, 17 Dec 2003 19:01:22 -0000
>From this evidence, libxslt appear to be getting it wrong, and you
should raise this with the supplier (or just switch to a different
processor).

Michael Kay

> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> Jones, Rick
> Sent: 17 December 2003 16:59
> To: 'XSL-List@xxxxxxxxxxxxxxxxxxxxxx'
> Subject: [xsl] Literal result element namespace differs from 
> xsl:element namespace
> 
> 
> I'm getting a problem with namespaces, where the output 
> document needs to change its namespace in the middle. Saxon 
> works OK, but libxslt behaves differently.
> 
> Here's a highly simplified example - the intended output is:
> 
> <?xml version="1.0"?>
> <Message xmlns="http://me.envelope";>
>   <Header>
>     <Title>My document</Title>
>     <From>someone</From>
>   </Header
>   <Body xmlns="http://me.content";>
>     <Item>
>       <Ref>1234</Ref>
>       <Info desc="A widget">
>         <Note>min qty 5</Note>
>       </Info>
>       <Quantity>10</Quantity>
>     </Item>
>     <!-- etc. -->
> </Message>
> 
> 	note the change in namespace (fictitious URIs for simplicity)
> 
> Source is:
> 
> <?xml version="1.0"?>
> <report>
> 	<title>My Document</title>
> 	<origin>someone</origin>
> 	<form>
> 		<code>1234</code>
> 		<description note="min qty 5">A widget</description>
> 		<qty>10</qty>
> 	</form>
> 	<form>
> 		<code>99999</code>
> 		<description note="add 
> comment">Miscellaneous</description>
> 		<qty>3</qty>
> 	</form>
> </report>
> 
> And stylesheet is:
> 
> <?xml version="1.0"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>     xmlns="http://me.envelope";
>     version="1.0">
>   <xsl:output method="xml" indent="yes"/>
>   <xsl:template match="report">
>     <Message>
>       <Header>
>         <Title><xsl:value-of select="title"/></Title>
>         <From><xsl:value-of select="origin"/></From>
>       </Header>
>       <Body xmlns="http://me.content";>
>         <xsl:for-each select="form">
>           <Item>
>             <Ref><xsl:value-of select="code"/></Ref>
>             <xsl:element name="Info">
>               <xsl:attribute name="desc">
>                 <xsl:value-of select="description"/>
>               </xsl:attribute>
>               <Note><xsl:value-of select="description/@note"/></Note>
>             </xsl:element>
>             <Quantity><xsl:value-of select="qty"/></Quantity>
>           </Item>
>         </xsl:for-each>
>       </Body>
>     </Message>
>   </xsl:template>
> </xsl:stylesheet>
> 
> But using libxslt (in fact xsltproc) this produces:
> 
> <?xml version="1.0"?>
> <Message xmlns="http://me.envelope";>
>   <Header>
>     <Title>My Document</Title>
>     <From>someone</From>
>   </Header>
>   <Body xmlns="http://me.content";>
>     <Item xmlns="http://me.envelope";>
>       <Ref>1234</Ref>
>       <Info xmlns="http://me.content"; desc="A widget">
>         <Note xmlns="http://me.envelope";>min qty 5</Note>
>       </Info>
>       <Quantity>10</Quantity>
>     </Item>
>     <Item xmlns="http://me.envelope";>
>       <Ref>99999</Ref>
>       <Info xmlns="http://me.content"; desc="Miscellaneous">
>         <Note xmlns="http://me.envelope";>add comment</Note>
>       </Info>
>       <Quantity>3</Quantity>
>     </Item>
>   </Body>
> </Message>
> 
> 	note all the xmlns attributes !
> 
> It seems to assume that literal result elements in the style 
> sheet that are children of Body belong to the top-level 
> default namespace, not the namespace declared on Body. It 
> thus switches namespace in the output.
> 
> However, elements created by xsl:element are assumed to 
> belong to the inner namespace. With a mixture of both methods 
> of creating elements, the output contains a mass of namespace 
> changes (all wrong).
> 
> The real application is vastly more complex than this, and 
> I'm hoping to be able to use xsltproc (or a custom app using 
> libxslt) without having to resort to major reconstruction of 
> the stylesheet (the only way I can see to fix it so far is to 
> add explicit namespaces to every element in the stylesheet :( )
> 
> It strikes me as inconsistent, but I can't find anything 
> explicit in the books or docs. that says how this should 
> work. Is Saxon and MSXML wrong, or is libxslt - or is it "undefined"?
> 
> Comments and suggestions much appreciated
> 
> TIA
> Rick Jones
> 
> 
> --------------------------------------------------------------
> ------------------------------
> The statements and opinions expressed here are my own
> and may not represent those of the company.
> This e-mail is subject to copyright and the information in it 
> is confidential. It is intended only for the named recipient. 
> You are advised not to disclose the contents of this e-mail
> to another person or take copies of it.
> --------------------------------------------------------------
> -------------------------------
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


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


Current Thread