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