logo       
Google Custom Search
    AddThis Social Bookmark Button

Re: Why does Doctype change processing of a document: msg#00003

Subject: Re: Why does Doctype change processing of a document

Hi,

With the DOCTYPE declaration the default namespace gets set to "http://www.w3.org/1999/xhtml" so <xsl:template match="html"> does not match the html node because they are in different namespaces.  The test="name(child::node())='html'" passes because there is no namespace prefix so the result of name() is still 'html'.

From the xhtml1-strict.dtd:

<!--================ Document Structure ==================================-->

<!-- the namespace URI designates the document profile -->

<!ELEMENT html (head, body)>
<!ATTLIST html
  %i18n;
  id          ID             #IMPLIED
  xmlns       %URI;          #FIXED 'http://www.w3.org/1999/xhtml'
  >

To handle input documents with the DOCTYPE declaration you can add the following namespace declaration to your stylesheet:

xmlns:xhtml="http://www.w3.org/1999/xhtml"

and change your templates to use the prefix, such as:

<xsl:template match="xhtml:html">

If you want to be able to handle input documents with or without the DOCTYPE declaration then you would need to do something like this:

<xsl:template match="*[local-name()='html']">

Thanks.


Erin Harris




Ferdinand Soethe <ferdinand@xxxxxxxxxx>

01/05/2007 02:37 AM

To
xalan-j-users@xxxxxxxxxxxxxx
cc
Subject
Why does Doctype change processing of a document





I', processing the document below with Xalan and the template below
experience a funny effect that I cannot explain.

As long as I have the <!DOCTYPE-element in my document, processing will
correctly go as far as

> <xsl:template match="/">
>>      <xsl:choose>
>>                        <xsl:when test="name(child::node())='html'">
>>                  <xsl:apply-templates/>
>>                     </xsl:when>

but then apply templates will ignore the correct template

> <xsl:template match="html">

and jump to the default template right at the bottom
<xsl:template match="@*|*|text()|processing-instruction()|comment()">
and mess up the transformation.

As soon as I remove the <!DOCTYPE-element everything works just fine.

Can anybody tell me what I'm missing here?

Thanks,
Ferdinand


Document

> <?xml version="1.0" encoding="ISO-8859-1"?>
> <!DOCTYPE html
>      PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
>      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
> <html>
>     <!-- Diese Datei ist die Leitseite des Kursprogramms und muss händisch gepflegt werden -->
>     <head>
>         <title>Leitseite Gesamtprogramm</title>
>     </head>
>     <body
>         class="Leitseite_Gesamtprogramm">
>         <h1>Leitseite Gesamtprogramm</h1>
>         <?php phpinfo();
>     ?>
>         <p
>             class="Absatz">Sie befinden sich auf der Leitseite des
>             Gesamtprogramms des Bildungsvereins Hannover. </p>
>         <p
>             class="Absatz">Herzlich willkommen! </p>
>     </body>
> </html>

Template

> <?xml version="1.0"?>
> <xsl:stylesheet
>     version="1.0"
>     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
>     <xsl:key name="h2s" match="h2" use="generate-id(preceding-sibling::h1[1])"/>
>     <xsl:key name="h3s" match="h3" use="generate-id(preceding-sibling::h2[1])"/>
>     <xsl:key name="h4s" match="h4" use="generate-id(preceding-sibling::h3[1])"/>
>     <xsl:key name="h5s" match="h5" use="generate-id(preceding-sibling::h4[1])"/>
>     <xsl:key name="h6s" match="h6" use="generate-id(preceding-sibling::h5[1])"/>
>
>     <xsl:template match="/">
>      <xsl:choose>
>                        <xsl:when test="name(child::node())='html'">
>                  <xsl:apply-templates/>
>                     </xsl:when>
>                     <xsl:otherwise>
>                       <document>
>                        <header><title>Error in conversion</title></header>
>                        <body>
>                         <warning>This file is not in a html format, please convert manually.</warning>
>                        </body>
>                       </document>
>                     </xsl:otherwise>
>      </xsl:choose>
>     </xsl:template>
>            
>     <xsl:template match="html">
>         <document>
>             <xsl:apply-templates/>
>         </document>
>     </xsl:template>
>
>     <xsl:template match="head">
>         <header>
>             <xsl:apply-templates/>
>         </header>
>     </xsl:template>
>        
>     <xsl:template match="meta">
>         <xsl:copy>
>             <xsl:apply-templates select="node()|@*"/>
>         </xsl:copy>
>     </xsl:template>  
>    
>     <!--infer structure from sibling headings-->
>     <xsl:template match="body">
>        <body>
>           <xsl:apply-templates select="*[1]" mode="next"/>
>           <xsl:call-template name="process_h1"/>
>        </body>
>     </xsl:template>
>    
>     <!-- process all of documents content -->
>     <xsl:template name="process_h1">
>         <!-- start with each h1-heading -->
>        <xsl:for-each select="h1">
>          <!-- wrap a section all around it's content -->
>          <section>
>              <xsl:choose>
>                  <xsl:when test="a/@name">
>                      <xsl:attribute name="id"><xsl:value-of select="a/@name"/></xsl:attribute>
>                      <xsl:copy-of select="@style|@class" />
>                  </xsl:when>
>                  <xsl:otherwise>
>                      <xsl:copy-of select="@id|@style|@class" />
>                  </xsl:otherwise>
>              </xsl:choose>
>            
>            <!-- process heading text as title -->  
>            <title><xsl:apply-templates/></title>
>            <!-- process all non heading elements following the heading -->  
>            <xsl:apply-templates select="following-sibling::*[1]" mode="next"/>
>            <!-- then process all second level headings within this first level heading -->  
>            <xsl:for-each select="key('h2s',generate-id(.))">
>              <section>
>                 <xsl:copy-of select="@id|@style|@class" />
>                <title><xsl:apply-templates/></title>
>                <xsl:apply-templates select="following-sibling::*[1]" mode="next"/>
>                <xsl:for-each select="key('h3s',generate-id(.))">
>                  <section>
>                    <xsl:copy-of select="@id|@style|@class" />
>                    <title><xsl:apply-templates/></title>
>                    <xsl:apply-templates select="following-sibling::*[1]"
>                                         mode="next"/>
>                    <xsl:for-each select="key('h4s',generate-id(.))">
>                      <section>
>                        <xsl:copy-of select="@id|@style|@class" />  
>                        <title><xsl:apply-templates/></title>
>                        <xsl:apply-templates select="following-sibling::*[1]"
>                                             mode="next"/>
>                        <xsl:for-each select="key('h5s',generate-id(.))">
>                          <section>
>                            <xsl:copy-of select="@id|@style|@class" />  
>                            <title><xsl:apply-templates/></title>
>                            <xsl:apply-templates select="following-sibling::*[1]"
>                                                 mode="next"/>
>                            <xsl:for-each select="key('h6s',generate-id(.))">
>                              <section>
>                                <xsl:copy-of select="@id|@style|@class" />  
>                                <title><xsl:apply-templates/></title>
>                             <xsl:apply-templates select="following-sibling::*[1]" mode="next"/>
>                              </section>
>                            </xsl:for-each>
>                          </section>
>                        </xsl:for-each>
>                      </section>
>                    </xsl:for-each>
>                  </section>
>                </xsl:for-each>
>              </section>
>            </xsl:for-each>
>          </section>
>        </xsl:for-each>
>     </xsl:template>
>    
>     <!--process each sibling in order until the next heading level-->
>
>     <xsl:template match="*" mode="next">
>        <xsl:if test="not( translate( local-name(.),'123456','' ) = 'h' )">
>          <xsl:apply-templates select="."/>
>          <xsl:apply-templates select="following-sibling::*[1]" mode="next"/>
>        </xsl:if>
>     </xsl:template>
>      
>     <xsl:template match="P|p">
>         <p>
>           <xsl:if test="@class">
>             <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
>           </xsl:if>
>             <xsl:copy-of select="@id|@style" />
>           <xsl:apply-templates/>
>         </p>
>     </xsl:template>
>    
>     <xsl:template match="img">
>        
>        <xsl:choose>
>                      <xsl:when test="name(..)='section'">
>           <figure alt="{@alt}" src= ""> >               <xsl:copy-of select="@id|@style|@class|@align|@usemap" />
>           </figure>
>                      </xsl:when>
>                      <xsl:otherwise>
>                          <img alt="{@alt}" src= ""> >               <xsl:copy-of select="@id|@style|@class|@align|@usemap" />
>           </img>
>                      </xsl:otherwise>
>        </xsl:choose>
>        
>     </xsl:template>
>    
>     <xsl:template match="source|blockquote">
>       <xsl:choose>
>                      <xsl:when test="name(..)='p'">
>                        <code>
>                            <xsl:copy-of select="@id|@style|@class" />
>                          <xsl:value-of select="." />
>                        </code>
>                      </xsl:when>
>      
>                      <xsl:otherwise>
>                        <source>
>                            <xsl:copy-of select="@id|@style|@class" />
>                          <xsl:value-of select="." />
>                        </source>
>                      </xsl:otherwise>
>        </xsl:choose>
>     </xsl:template>
>
>  
>     <!-- convert a to link -->
>     <xsl:template match="a">
>      
>       <xsl:if test="@name">
>         <!-- Attach an id to the current node -->
>         <xsl:attribute name="id"><xsl:value-of select="translate(@name, ' $', '__')"/></xsl:attribute>
>         <xsl:apply-templates/>
>       </xsl:if>
>       <xsl:if test="@href">
>           <link href=""> >             <xsl:copy-of select="@id|@class|@target|@onclick|@title" />
>           <xsl:apply-templates/>
>         </link>
>       </xsl:if>
>        
>     </xsl:template>
>    
>     <xsl:template match="@valign | @align"/>
>        
>     <xsl:template match="center">
>       <xsl:choose>
>                      <xsl:when test="name(..)='p'">
>                          <xsl:copy-of select="@id|@style|@class" />
>                          <xsl:apply-templates/>
>                      </xsl:when>
>      
>                      <xsl:otherwise>
>                        <p>
>                            <xsl:copy-of select="@id|@style|@class" />
>                          <xsl:apply-templates/>
>                        </p>
>                      </xsl:otherwise>
>        </xsl:choose>
>     </xsl:template>
>
>     <xsl:template match="ol">
>       <xsl:choose>
>                      <xsl:when test="name(..)='p'">
>                         <xsl:text disable-output-escaping="yes"><![CDATA[</p>]]></xsl:text>
>                          <ol>
>                              <xsl:copy-of select="@id|@style|@class" />
>                           <xsl:apply-templates/>
>                          </ol>
>                         <xsl:text disable-output-escaping="yes"><![CDATA[<p>]]></xsl:text>
>                      </xsl:when>
>                        <xsl:otherwise>
>                          <ol>
>                              <xsl:copy-of select="@id|@style|@class" />
>                           <xsl:apply-templates/>
>                          </ol>
>                      </xsl:otherwise>
>        </xsl:choose>
>     </xsl:template>
>    
>     <xsl:template match="ul">
>       <xsl:choose>
>                      <xsl:when test="name(..)='p'">
>                         <xsl:text disable-output-escaping="yes"><![CDATA[</p>]]></xsl:text>
>                          <ul>
>                              <xsl:copy-of select="@id|@style|@class" />
>                           <xsl:apply-templates/>
>                          </ul>
>                         <xsl:text disable-output-escaping="yes"><![CDATA[<p>]]></xsl:text>
>                      </xsl:when>
>                        <xsl:otherwise>
>                          <ul>
>                              <xsl:copy-of select="@id|@style|@class" />
>                           <xsl:apply-templates/>
>                          </ul>
>                      </xsl:otherwise>
>        </xsl:choose>
>     </xsl:template>
>        
>     <xsl:template match="b">
>       <strong>
>         <xsl:value-of select = "."/>
>       </strong>
>     </xsl:template>
>    
>     <xsl:template match="i">
>       <em>
>           <xsl:copy-of select="@id|@style|@class" />
>         <xsl:value-of select = "."/>
>       </em>
>     </xsl:template>
>
>     <xsl:template match="u">
>       <u>
>           <xsl:copy-of select="@id|@style|@class" />
>         <xsl:value-of select = "."/>
>       </u>
>     </xsl:template>
>    
>     <xsl:template match="table">
>       <xsl:copy>
>         <xsl:copy-of select="@*"/>
>         <xsl:apply-templates/>
>       </xsl:copy>    
>     </xsl:template>
>    
>            
>     <xsl:template match="br">
>       <xsl:choose>
>                      <xsl:when test="normalize-space(text())">
>                                          
>                                     <xsl:choose>
>                                       <xsl:when test="name(..)='p'">
>                                          
>                                           <xsl:apply-templates/>
>                                         <br>
>                                             <xsl:copy-of select="@id|@style|@class" />
>                                         </br>
>                                       </xsl:when>
>                                         <xsl:otherwise>
>                                         <p>
>                              <xsl:apply-templates/>
>                                         </p>
>                                       </xsl:otherwise>
>                         </xsl:choose>
>                        
>                      </xsl:when>
>                        <xsl:otherwise>
>                        <br>
>                            <xsl:copy-of select="@id|@style|@class" />
>                        </br>
>                      </xsl:otherwise>
>        </xsl:choose>
>     </xsl:template>
>    
>     <!-- Strip -->
>     <xsl:template match="font|big">
>         <xsl:copy-of select="@id|@style|@class" />
>       <xsl:apply-templates/>
>     </xsl:template>
>
>
>    
>
>    
>     <xsl:template match="@*|*|text()|processing-instruction()|comment()">
>         <xsl:message><xsl:value-of select="name(.)"/></xsl:message>
>       <xsl:copy>
>         <xsl:apply-templates select="@*|*|text()|processing-instruction()|comment()"/>
>       </xsl:copy>
>     </xsl:template>
>
>
> </xsl:stylesheet>


<Prev in Thread] Current Thread [Next in Thread>