2012-04-13 4 views
1

Я пытаюсь повлиять на свойства списка fo: list-block в процедуре docbook 5. То, что я хочу сделать, это принять следующий код DocBook XML:Укладка части процедуры docbook с использованием XSL

<procedure> 
    <title>Eating a banana</title> 
    <step><para>Find banana</para></step> 
    <step><para>Peel banana</para></step> 
    <step><para>Stick banana in mouth</para></step> 
<procedure> 

и влияют на выход FO из всего шагов (список), а не название.

Используя это:

<xsl:template match="d:procedure"> 
    <fo:block border-left-width="1pt" border-left-style="solid" padding-left="0.25in"> 
     <xsl:apply-imports /> 
    </fo:block> 
</xsl:template> 

получает мне что-то вроде этого:

| 
| Procedure 1: Eating a banana 
| 1. Find banana 
| 2. Peal banana 
| 3. Stick banana in mouth 
| 

То, что я пытаюсь получить это:

Procedure 1: Eating a banana 
    | 1. Find banana 
    | 2. Peal banana 
    | 3. Stick banana in mouth 

Пытаясь соответствовать к <step> недействителен , так как docbook превращает их в fo: list-block (fo:block как потомок fo:list-block генерирует ошибку «неверный ребенок»).

Docbook имеет набор атрибутов xsl: для <procedures>, но насколько я могу судить, это можно использовать только для стилизации всего блока (аналогично шаблону match = 'd: procedure), а не только к списку .

ответ

1

Вот как это можно сделать

  1. Добавить эту версию "процедуры" шаблон (оригинал находится в lists.xsl) к вашему настройки слоя:.

    <xsl:template match="d:procedure"> 
        <xsl:variable name="id"> 
        <xsl:call-template name="object.id"/> 
        </xsl:variable> 
    
        <!-- Preserve order of PIs and comments --> 
        <xsl:variable name="preamble" 
         select="*[not(self::d:step 
            or self::d:title 
            or self::d:titleabbrev)] 
           |comment()[not(preceding-sibling::d:step)] 
           |processing-instruction()[not(preceding-sibling::d:step)]"/> 
    
        <xsl:variable name="steps" 
           select="d:step 
             |comment()[preceding-sibling::d:step] 
             |processing-instruction()[preceding-sibling::d:step]"/> 
    
        <xsl:call-template name="formal.object.heading"/> 
    
        <fo:block id="{$id}" xsl:use-attribute-sets="procedure.properties list.block.spacing" 
         border-left-width="1pt" border-left-style="solid" padding-left="0.25in"> 
    
        <xsl:apply-templates select="$preamble"/> 
    
        <fo:list-block xsl:use-attribute-sets="list.block.spacing" 
            provisional-distance-between-starts="2em" 
            provisional-label-separation="0.2em"> 
         <xsl:apply-templates select="$steps"/> 
        </fo:list-block> 
    
        </fo:block> 
    </xsl:template> 
    

    <xsl:call-template name="formal.object.heading"/> (который возвращает fo:block с названием процедуры) выполняется до того, как будет выведена рамка. Я также упростил шаблон, удалив код, который обрабатывает размещение заголовка.

  2. Добавить текст-отступ в formal.title.properties-атрибуте набор:

    <xsl:attribute-set name="formal.title.properties" 
           use-attribute-sets="normal.para.spacing"> 
        <xsl:attribute name="text-indent"> 
        <xsl:choose> 
         <xsl:when test="self::d:procedure">-30pt</xsl:when> 
         <xsl:otherwise>0pt</xsl:otherwise> 
        </xsl:choose> 
        </xsl:attribute> 
    </xsl:attribute-set> 
    

Это подтолкнет заголовок процедуры влево (но оставить другие названия в одиночку).

+0

Это отлично работает! – Scribblemacher

0

Я придумал эту идею. Хотя он отлично работает для одноуровневых процедур, что-либо с подшагами вызовет проблемы.

<xsl:template match="d:step"> 
    <fo:list-item margin-left="0.25in" padding-left='1em' border-left-width='2pt' border-left-color="gray" border-left-style='solid'> 
     <fo:list-item-label start-indent="0.40in" end-indent="label-end()"> 
      <fo:block> 
       <xsl:number format="1."/> 
      </fo:block> 
     </fo:list-item-label>  
     <fo:list-item-body start-indent="3.5pc"> 
      <fo:block> 
       <xsl:apply-templates /> 
      </fo:block> 
     </fo:list-item-body> 
    </fo:list-item> 
</xsl:template> 
Смежные вопросы