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 <[EMAIL PROTECTED]> 
01/05/2007 02:37 AM

To
xalan-j-users@xml.apache.org
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="[EMAIL PROTECTED]" src= "[EMAIL PROTECTED]">
>               <xsl:copy-of select="@id|@style|@class|@align|@usemap" />
>           </figure>
>                </xsl:when>
>                <xsl:otherwise>
>                    <img alt="[EMAIL PROTECTED]" src= "[EMAIL PROTECTED]">
>               <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="[EMAIL PROTECTED]">
>             <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>


Reply via email to