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



I posted the following on the Mulberrytech XSL list (actually I got confused
about the lists :( ), where Michael Kay among others believes it's a bug in
libxslt. I'm already using libxml2 & xmlsec in this project, so I'd prefer
to keep with one family and set of libraries, hence I'm keen to be able to
handle this with libxslt. Is it fixable?


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.
---------------------------------------------------------------------------------------------




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]