Re: [xsl] namespace problem

Subject: Re: [xsl] namespace problem
From: "Wolfgang Laun wolfgang.laun@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 5 Sep 2014 15:23:24 -0000
Hi Ruud,

I'm not sure what you misunderstood, but here's the XSLT that does what you
want. I've added a couple of comments to indicate what goes on where.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform i Ruud,version="2.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
   xmlns:xs="http://www.w3.org/2001/XMLSchema";
   exclude-result-prefixes="xs xsl">

  <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" />

  <xsl:template match="/">
    <!-- establish the default namespace for the created document -->
    <document xmlns="http://www.w3.org/1999/xhtml";>
      <xsl:apply-templates/>
    </document>
  </xsl:template>

  <!-- match an element from the no-namespace -->
  <xsl:template xmlns="" match="p">
    <xsl:variable name='blip'>
      <xsl:apply-templates />
    </xsl:variable>

    <xsl:apply-templates select='$blip' mode='pass2' />
  </xsl:template>

  <!-- match another element from the no-namespace -->
  <xsl:template xmlns="" match="Char">
    <!-- element created here is in the no-namespace -->
    <char><xsl:apply-templates /></char>
  </xsl:template>

  <!-- match the element created during pass 1, still from the no-namespace
-->
  <xsl:template xmlns="" match='char' mode='#all'>
    <!-- element for the final document, to be in the (re-established)
xhtml-ish default namespace -->
    <c xmlns="http://www.w3.org/1999/xhtml";><xsl:apply-templates /></c>
  </xsl:template>
</xsl:transform>

Input:
<doc>
<p><Char>hello</Char><Char> there</Char></p>
</doc>

Output:
<?xml version="1.0" encoding="utf-8"?>
<document xmlns="http://www.w3.org/1999/xhtml";>
   <c>hello</c>
   <c> there</c>
</document>

HTH
Wolfgang




On 4 September 2014 09:16, Ruud Grosmann r.grosmann@xxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> Hi Wolfgang,
>
> thanks for your reaction
>
> On 09/03/14 17:37, Wolfgang Laun wolfgang.laun@xxxxxxxxx wrote:
>
>> You need to match a document that has elements <doc>, <p>, <Char> that are
>> in *no namespace*, where the name has no namespace name, just a locsl
>> name.
>> Your output document is supposed to be in the namespace "
>> http://www.w3.org/1999/xhtml";, and you'd like to use the shortened
>> notation
>> known as *default namespace*. In the 2nd version of your XSLT you
>> introduce
>> a default namespace, and, sure enough, the matches written without a
>> prefix
>> aren't in the no namespace ghetto any more.
>>
>
> That puzzles me a bit, because templates p and Char *do* match. The
> difference is the char template, the char elements are now part of the
> documentnode in the blip variable.
> I tried to change the namespace of that documentnode, but up till now, I
> have not succeeded.
>
>
>  You may, however, at any time cancel the definition for the default
>> namespace by writing
>>
>>      xmlns=""
>>
>> and everything below that has no prefix hasn't a namespace name either.
>>
>>
> Assuming this has to be added to a template match, I tried this:
>
>   <xsl:template xmlns='' match='char' mode='#all'>
>     <c><xsl:apply-templates /></c>
>   </xsl:template>
>
> But that does not work either, nor when I change that to the xhtml
> namespace.
>
> Maybe I misunderstood you. Thanks for the explanation; I realize more and
> more it is essential to have a good understanding of namespaces...
>
> regards, Ruud

Current Thread