RE: [docbook-apps] variablelist styles

From
David Cramer <>
Date
2010-03-03T17:10:09+00:00
ID
Thread
RE: [docbook-apps] variablelist styles
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>&#160;</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() &gt; 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.