我正在尝试影响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
的后代生成“无效子”错误。)< / p>
Docbook有<procedures>
的xsl:属性集,但据我所知,这只能用于整个块的样式(类似于模板匹配='d:procedure',而不是只是列表。
答案 0 :(得分:1)
以下是如何做到的。
将此版本的“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>
<xsl:call-template name="formal.object.heading"/>
(返回带有过程标题的fo:block
)在输出带边框的块之前执行。我还通过删除处理标题放置的代码来简化模板。
在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>
这会将程序标题推向左侧(但仅保留其他标题)。
答案 1 :(得分: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>