Xslt 使用XSL设置docbook过程的样式部分
我试图在docbook 5过程中影响fo:list块的属性。我要做的是获取以下docbook XML代码: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>
<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',而不仅仅是列表。这是如何实现的
<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: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>