Ok, the problem is the whitespace between <term> and
<guilabel>. It's collapsed to a single space when the doc is parsed, but
that space is kept. A simple solution that would solve that problem (but cause
some others) is to change:
<xsl:apply-templates select="term"/>
to:
<xsl:value-of
select="normalize-space(term)"/>
That will ensure that you get the text nodes of the term
element with preceding and trailing whitespace removed BUT you also lose any
markup. For example, If you have <term><emphasis
role="italic">Foo</emphais> bar</term> and you expected
to see "Foo" in italics, you would be dissapointed. Also, if you for
some reason did <term>See <xref
linkend="blah"/></term> the xref would be dropped. So it's
dangerous.
Otherwise, I think you'd have to use apply-templates to get
the term into a variable, write some xsl that inspects the beginning text node
(if there is one), and uses substring on that node to remove the first space if
there is one. Sounds kind of hairy. Maybe Bob or someone has a better idea or
there's some exisiting convenient way to handle that situation.
If your editor lets you control the pretty printing it does on
the document, you could configure it not to but a linebreak before inline
elements and after the beginning <term> tag.
David
From: Laurie Burley
[mailto:]
Sent: Wednesday, March 03, 2010
8:59 AM
To: David Cramer;
Subject: RE: [docbook-apps]
variablelist styles
Hi
David,
In the
end, I managed to get my variablelists to appear on the same line with a bold
term, followed by the listitem paragraph.
However, I am now seeing something
very odd happening if the term element contains a guilabel or guibutton tag.
(Note that our guilabel/guibutton tags have no visual effect, but are
necessary for translation purposes)
If a
term has a guilabel/guibutton, an extra space appears before and after the
term, causing it to indent one space, and the runinhead to appear after a
space.
The
code I'm using for the XML is as follows:
<para>To show the margins</para>
<variablelist>
<varlistentry>
<term>
<guilabel>Test Label1</guilabel>
</term>
<listitem>
<para>The para to go with the
label1.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<guilabel>Test Label2</guilabel>
</term>
<listitem>
<para>The para to go with the
label2.</para>
</listitem>
</varlistentry>
<varlistentry><term><guilabel>Test Label3 on single
line</guilabel></term><listitem><para>Paragraph to go with label3</para></listitem></varlistentry>
</variablelist>
<para>Paragraph to show the
margins</para>
And
this is how it looks when rendered:
As you
can see, there is a slight space before the first 2 labels and another before
the full stops at the end (runinhead). The third line has been modified in
code so the term and its contents all appear on the same line. Unfortunately,
I cannot figure out why the output does this.
Is
anyone aware of what might cause this? We have not modified the guilabel or
guibutton tags from their default state. We are using version 1.74 of the
docbook styles.
Any
suggestions would be helpful.
Also,
here is the code I modified to get the variablelists to appear on the same
line.
<xsl:template match="varlistentry"
mode="vl.as.blocks">
<xsl:variable name="id">
<xsl:call-template name="object.id"/>
</xsl:variable>
<fo:block padding-top="2pt"
padding-bottom="2pt">
<fo:wrapper font-weight="bold">
<xsl:apply-templates select="term"/>
<xsl:value-of select="$runinhead.default.title.end.punct"/>
</fo:wrapper>
<xsl:apply-templates select="varlistentry/listitem"/>
</fo:block>
</xsl:template>
<!--This
template ensures that a fo:block is not added around the initial
paragraph-->
<!—-which
enables the term element to appear on the same line. Subsequent
paragraph-->
<!--entries are
rendered inside an fo:block as expected-->
<xsl:template match="varlistentry/listitem/para">
<xsl:choose>
<xsl:when test="not(preceding-sibling::*)">
<xsl:call-template name="anchor"/>
<xsl:apply-templates/>
</xsl:when>
<xsl:otherwise>
<fo:block>
<xsl:if test="@role and $para.propagates.style != 0">
<xsl:apply-templates select="." mode="class.attribute">
<xsl:with-param name="class" select="@role"/>
</xsl:apply-templates>
</xsl:if>
<xsl:call-template name="anchor"/>
<xsl:apply-templates/>
</fo:block>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Kind
Regards,
Laurie.
-----Original Message-----
From:
David Cramer [mailto:]
Sent: 11 February 2010
19:17
To: Laurie Burley
Subject: RE: [docbook-apps] variablelist
styles
Sure thing. Be sure to test with a variety of
legal
varlistentry/listitems and think what you might want to
have happen if
someone does something weird. E.g.
varlistentry/listitem/formalpara
(which would give you a runinhead, followed by a
runinhead!). Sometimes
I add <xsl:message terminate="yes">Some helpful
error message explaining
the unsupported constuct.</xsl:message> when I
find a construct I don't
want to support and don't want people to
use.
David
> -----Original Message-----
> From: Laurie Burley
[mailto:]
> Sent: Thursday, February 11, 2010 10:53
AM
> To: David Cramer;
; DeanNelson
> Subject: RE: [docbook-apps] variablelist
styles
>
> Thanks David,
>
> I also managed to get this working by creating a
new
> listitem/para template similar to the simpara..so a
<p> tag
> is not automatically applied to the listitem
paragraph if the
> first child is a para.
>
> I had a harder time with the FO output, but I
removed some of
> the blocks and replaced them with wrappers, and it
works as well.
>
> I will however, give your suggestion a try, just in
case it
> is cleaner ;).
>
> Kind Regards,
>
> Laurie.
>
>
>
> Laurie Burley
> Sr. Tech Comm Spc.
> Kofax U.K., Ltd.
>
> 201 Cambridge Science Park
> Milton Road, Cambridge
> CB4 0GZ
> United Kingdom
>
> Tel: +44 (0) 1223 226021
>
> -----Original Message-----
> From: David Cramer
[mailto:]
> Sent: 11 February 2010 15:49
> To: Laurie Burley;
; DeanNelson
> Subject: RE: [docbook-apps] variablelist
styles
>
>
> Hi Laurie,
> Ok, for html output the following customization
layer will do
> what you want. The parameter
variablelist.as.runinhead is set
> to 1 (and variablelist.as.table must also be 0 or
it will
> win) OR you can use the <?dbhtml
> list-presentation="runinhead"?> for individual
variablelists.
>
> One thing to note: this works fine for the normal
case where
> you have a varlistentry/lisitem/para (where para is
the first
> child of the listitem), but what if they do
> varlistentry/listitem/*[1], where the first child
of the
> listitem is not a para? That could end up looking
funny.
> Currently, I only do the runinhead thing if the
first child
> is a para. Otherwise, the normal formatting of the
elment
> happens. You'll probably want to adapt it to real
life, but
> this should get you started.
> Of course, you'll probably also want to do the same
thing for
> the fo xsls :-)
>
> This only overrides one template from the base xsls
(the one
> for variablelist). The other templates are new
additions.
>
> Good luck,
> David
>
> <xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> version="1.0">
>
> <xsl:import
>
href="http://docbook.sourceforge.net/release/xsl/current/html/
> docbook.xs
> l"/>
>
> <xsl:param
name="variablelist.as.table">0</xsl:param>
> <xsl:param
name="variablelist.as.runinhead">1</xsl:param>
>
> <!-- DWC: Modified to support runinhead style
-->
> <xsl:template
match="variablelist">
> <xsl:variable
name="pi-presentation">
> <xsl:call-template
name="dbhtml-attribute">
>
<xsl:with-param name="pis"
>
select="processing-instruction('dbhtml')"/>
>
<xsl:with-param name="attribute"
select="'list-presentation'"/>
>
</xsl:call-template>
> </xsl:variable>
>
> <xsl:variable
name="presentation">
>
<xsl:choose>
> <xsl:when
test="$pi-presentation != ''">
>
<xsl:value-of select="$pi-presentation"/>
>
</xsl:when>
> <xsl:when
test="$variablelist.as.table != 0">
>
<xsl:value-of select="'table'"/>
>
</xsl:when>
> <xsl:when
test="$variablelist.as.runinhead != 0">
>
<xsl:value-of select="'runinhead'"/>
>
</xsl:when>
>
<xsl:otherwise>
>
<xsl:value-of select="'list'"/>
>
</xsl:otherwise>
>
</xsl:choose>
> </xsl:variable>
>
> <xsl:variable
name="list-width">
> <xsl:call-template
name="dbhtml-attribute">
>
<xsl:with-param name="pis"
>
select="processing-instruction('dbhtml')"/>
>
<xsl:with-param name="attribute" select="'list-width'"/>
>
</xsl:call-template>
> </xsl:variable>
>
> <xsl:variable
name="term-width">
> <xsl:call-template
name="dbhtml-attribute">
>
<xsl:with-param name="pis"
>
select="processing-instruction('dbhtml')"/>
>
<xsl:with-param name="attribute" select="'term-width'"/>
>
</xsl:call-template>
> </xsl:variable>
>
> <xsl:variable
name="table-summary">
> <xsl:call-template
name="dbhtml-attribute">
>
<xsl:with-param name="pis"
>
select="processing-instruction('dbhtml')"/>
>
<xsl:with-param name="attribute"
select="'table-summary'"/>
>
</xsl:call-template>
> </xsl:variable>
>
> <div>
> <xsl:apply-templates
select="." mode="class.attribute"/>
> <xsl:call-template
name="anchor"/>
> <xsl:if
test="title">
>
<xsl:call-template name="formal.object.heading"/>
>
</xsl:if>
>
>
<xsl:choose>
> <xsl:when
test="$presentation = 'table'">
>
<!-- Preserve order of PIs and comments -->
>
<xsl:apply-templates select="*[not(self::varlistentry
> or
self::title
or self::titleabbrev)]
>
|comment()[not(preceding-sibling::varlistentry)]
>
|processing-instruction()[not(preceding-sibling::varlistentry)]"/>
>
<table border="0">
>
<xsl:if test="$list-width != ''">
>
<xsl:attribute name="width">
>
<xsl:value-of select="$list-width"/>
>
</xsl:attribute>
>
</xsl:if>
>
<xsl:if test="$table-summary != ''">
>
<xsl:attribute name="summary">
>
<xsl:value-of select="$table-summary"/>
>
</xsl:attribute>
>
</xsl:if>
>
<col align="left" valign="top">
>
<xsl:if test="$term-width != ''">
>
<xsl:attribute name="width">
>
<xsl:value-of select="$term-width"/>
>
</xsl:attribute>
>
</xsl:if>
>
</col>
>
<tbody>
>
<xsl:apply-templates mode="varlist-table"
> select="varlistentry
>
|comment()[preceding-sibling::varlistentry]
>
|processing-instruction()[preceding-sibling::varlistentry]"/>
>
</tbody>
>
</table>
>
</xsl:when>
>
<!-- DWC: Adding support for new presentation type -->
> <xsl:when
test="$presentation = 'runinhead'">
>
<!-- Preserve order of PIs and comments -->
>
<xsl:apply-templates select="*[not(self::varlistentry
> or
self::title
or self::titleabbrev)]
>
|comment()[not(preceding-sibling::varlistentry)]
>
|processing-instruction()[not(preceding-sibling::varlistentry)]"/>
>
<ul style="list-style-type: none">
>
<xsl:apply-templates select="varlistentry
>
|comment()[preceding-sibling::varlistentry]
>
|processing-instruction()[preceding-sibling::varlistentry]"
> mode="varlist-runinhead"/>
>
</ul>
>
</xsl:when>
>
<xsl:otherwise>
>
<!-- Preserve order of PIs and comments -->
>
<xsl:apply-templates select="*[not(self::varlistentry
> or
self::title
or self::titleabbrev)]
>
|comment()[not(preceding-sibling::varlistentry)]
>
|processing-instruction()[not(preceding-sibling::varlistentry)]"/>
>
<dl>
>
<xsl:apply-templates select="varlistentry
>
|comment()[preceding-sibling::varlistentry]
>
|processing-instruction()[preceding-sibling::varlistentry]"/>
>
</dl>
>
</xsl:otherwise>
>
</xsl:choose>
> </div>
> </xsl:template>
>
> <!-- DWC: added the following templates to add
support for
> runinhead varlist style --> <xsl:template
> match="varlistentry"
mode="varlist-runinhead">
> <li>
> <xsl:call-template
name="anchor"/>
>
<p>
>
<xsl:apply-templates select="term"
> mode="varlist-runinhead"/>
>
<xsl:apply-templates select="listitem/para[1]"
> mode="varlist-runinhead"/>
>
</p>
>
<xsl:apply-templates select="listitem"
> mode="varlist-runinhead"/>
> </li>
> </xsl:template>
>
> <xsl:template match="term"
mode="varlist-runinhead">
> <xsl:variable
name="titleStr">
>
<xsl:apply-templates/>
> </xsl:variable>
> <xsl:variable
name="lastChar">
> <xsl:if test="$titleStr
!= ''">
>
<xsl:value-of
>
select="substring($titleStr,string-length($titleStr),1)"/>
>
</xsl:if>
> </xsl:variable>
>
> <b>
> <xsl:copy-of
select="$titleStr"/>
> <xsl:if test="$lastChar
!=
''
and
> not(contains($runinhead.title.end.punct,
$lastChar))">
>
<xsl:value-of
select="$runinhead.default.title.end.punct"/>
>
</xsl:if>
>
<xsl:text> </xsl:text>
> </b>
> </xsl:template>
>
> <xsl:template match="listitem"
mode="varlist-runinhead">
>
<xsl:choose>
>
<xsl:when test="*[1][self::para]">
>
<xsl:apply-templates select="*[position() > 1]"/>
>
</xsl:when>
>
<xsl:otherwise>
>
<xsl:apply-templates/>
>
</xsl:otherwise>
>
</xsl:choose>
> </xsl:template>
>
> <xsl:template match="para"
mode="varlist-runinhead">
>
<xsl:apply-templates/>
> </xsl:template>
>
> </xsl:stylesheet>
>
>
-------------------------------------------------
>
> This communication is only for the use of the
intended
> recipient. It may contain confidential or
proprietary
> information. If you are not the intended recipient
or have
> received this communication in error, please notify
the
> sender via phone and destroy this communication
immediately.
>
Laurie
Burley
Sr. Tech Comm Spc.
Kofax U.K., Ltd.
201
Cambridge Science Park
Milton Road, Cambridge
CB4 0GZ
United
Kingdom
Tel:
+44 (0) 1223 226021
This
communication is only for the use of the intended recipient. It may contain
confidential or proprietary information. If you are not the intended recipient
or have received this communication in error, please notify the sender via
phone and destroy this communication immediately.