1

docbook 5 プロシージャ内の fo:list-block のプロパティに影響を与えようとしています。私がやりたいことは、次の docbook XML コードを取得することです。

<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:attribute-set が<procedures>ありますが、私が知る限り、これはブロック全体のスタイル設定にしか使用できません (リストだけでなく、テンプレートの match='d:procedure' に似ています)。

4

2 に答える 2

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(プロシージャのタイトルでa を返します) は、境界線のあるブロックが出力される前に実行されます。また、タイトルの配置を処理するコードを削除して、テンプレートを簡素化しました。

  2. formal.title.properties属性セットに text-indent を追加します。

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

これにより、手順のタイトルが左に押し出されます (ただし、他のタイトルはそのままにします)。

于 2012-04-14T18:05:39.277 に答える
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>
于 2012-04-16T15:19:50.407 に答える