Hi Robert,
I think you have discovered a hole in the DocBook stylesheet setup of XHTML. Since
you asked "why?", here is the long explanation.
As it should, the XHTML output generated by xhtml/docbook.xsl or chunk.xsl puts all
HTML elements in the xhtml namespace, by setting the default namespace on the root
element of the XHTML output:
<html xmlns="http://www.w3.org/1999/xhtml">
When generating namespaced output, any output that includes a reference to the null
namespace by showing xmlns="" is an indication that some template or customization
forgot that it was outputting elements in that namespace. So instead, those elements
are output in the null namespace, and that xmlns="" must be added to those elements to
indicate such. If they didn't have that declaration, they would inherit the root
element's namespace declaration and be in the XHTML namespace. But since those
elements are not in the XHTML namespace, they have to opt out with xmlns="" to show
that they have no namespace.
Such "opting out" is usually the result of not including the declaration of that
namespace as the default output of the stylesheet. In the XHTML stylesheets, that is
done on the root element of the stylesheet:
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" etc.
Note that there is no namespace prefix in this declaration. This becomes the default
namespace for generated elements. After the XSLT processor has processed all the
content into memory and is ready to serialize the output, it tries to minimize the
number of namespace declarations in the output. If all goes as planned and all
elements are in that namespace, then the processor can put a single namespace
declaration on the root element, and all descendant elements will inherit it.
In XSL, it isn't enough to put this declaration on the main stylesheet file that you
call, such as docbook.xsl or chunk.xsl. Rather, this declaration must appear in *all*
the file modules that are imported or included to make up the stylesheet. If you look
in the DocBook xhtml directory, you will see that all the xsl files have that
declaration, including titlepage.templates.xsl.
But when you generated a new titlepage.templates.xsl from your custom spec file, it
did not have that default namespace declaration. Thus any instances of "<div>" or
other HTML elements appearing in those templates do not have a namespace, so they are
not in the XHTML namespace. So the XSLT processor has to indicate that lack of
namespace by adding xmlns="" to those elements, so they won't inherit the default
XHTML namespace from the root element.
To make a long story short, all you need to do to fix this problem is to manually add
xmlns="http://www.w3.org/1999/xhtml" to the <xsl:stylesheet> element of your generated
titlepage.templates.xsl. Then all the output from that module will also be in the
XHTML namespace, and the processor won't need to generate xmlns="" for them.
The "hole" that I mentioned at the start is that the stylesheet file
(template/titlepage.xsl) that generates a new titlepage.templates.xsl from a spec
file is not aware that the output for XHTML should be in that namespace. That's why
you need to add in manually after you generate the file.
So how does the xhtml/titlepage.templates.xsl that ships with DocBook XSL get that
declaration? Because it is not generated by templates/titlepage.xsl. Rather, it is
generated by the program that converts the html stylesheet files to xhtml stylesheet
files. That conversion program adds the namespace declaration to all the modules,
including that one. You probably noticed that the xhtml directory does not have a
titlepage.templates.xml (that's .xml, not .xsl) spec file.
I would appreciate if you would file a bug report on this issue.
Bob Stayton
Sagehill Enterprises
[email protected]
----- Original Message -----
From: "Robert Nagle" <[email protected]>
To: <[email protected]>
Sent: Sunday, December 19, 2010 2:44 PM
Subject: [docbook-apps] titlepage + XHTML + empty xmlns element: why?
My goal is to make chunked XHTML or HTML output. I wish to have an
abstract, but I want it to appear only in a meta tag, not in the main
text. In my customization layer I enabled the parameter
(generate.meta.abstract)
Bob Stayton has suggested a way to do this:
http://lists.oasis-open.org/archives/docbook-apps/201012/msg00077.html
Customize the titlepage template for HTML so that abstract is not
included in the main content for chapter.
This method works, but it produces invalid HTML and XHTML code. The
div tag which previously contained ABSTRACT now has a blank attribute
for xsmlns.
I tried using the latest docbook-ns and the regular docbook chunk xsl.
I tried both HTML and XHTML. The problem goes away when I remove the
line in the customization layer to include my customized titlepage
template.
This sounds like a bug to me. Can anyone confirm this and/or suggest a
way to solve this? Thanks.
rj
*****************************************
OUTPUT FOR ONE CHAPTER
<head>
...
<meta name="description" content="This is a test of the emergency
broadcast system." />
</head>
<body>
<div class="chapter" title="Chapter 4. RJ Test">
<div xmlns="" class="titlepage"></div>
<div class="mediaobject">
etc...
******************************************************
MY MODIFICATION TO TITLEPAGETEMPLATE:
<t:titlepage t:element="chapter" t:wrapper="div" class="titlepage">
<t:titlepage-content t:side="recto">
<title/>
<subtitle/>
<corpauthor/>
<authorgroup/>
<author/>
<othercredit/>
<releaseinfo/>
<copyright/>
<legalnotice/>
<pubdate/>
<revision/>
<revhistory/>
<!-- <abstract/>--> HERE"S WHAT I CHANGED
</t:titlepage-content>
--
Robert Nagle
12777 Ashford Point Dr #1417
Houston, Texas 77082
713 893 3424
http://www.robertnagle.info
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]