Xslt 使用XSL设置docbook过程的样式部分

Xslt 使用XSL设置docbook过程的样式部分,xslt,xsl-fo,docbook,docbook-5,Xslt,Xsl Fo,Docbook,Docbook 5,我试图在docbook 5过程中影响fo:list块的属性。我要做的是获取以下docbook XML代码: <procedure> <title>Eating a banana</title> <step><para>Find banana</para></step> <step><para>Peel banana</para></step>

我试图在docbook 5过程中影响fo:list块的属性。我要做的是获取以下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>
我想得到的是:

Procedure 1: Eating a banana
  |   1. Find banana
  |   2. Peal banana
  |   3. Stick banana in mouth
尝试匹配到
是无效的,因为docbook会将它们转换为fo:list block(
fo:block
作为
fo:list block
的后代生成一个“无效子”错误)


Docbook为
设置了一个xsl:attribute,但据我所知,它只能用于设置整个块的样式(类似于模板match='d:procedure',而不仅仅是列表。

这是如何实现的

  • 将此版本的“过程”模板(原始模板位于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>
    

  • 这将把程序标题推到左边(但不要管其他标题)。

    下面是如何操作的

  • 将此版本的“过程”模板(原始模板位于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: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>
    

    我提出了这个想法。虽然它对单级过程很有效,但任何带有子步骤的操作都会导致问题

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