You need an own processing instruction (not one from the DocBook XSL stylesheets) to fine-tune your transformation.
The DocBook XSL stylesheet offers the
pi-attribute
template for this purpose. It
expects a processing instruction node and a
“pseudo-attribute” name. For example, the following
processing instruction is given:
<?toms-html background-color="blue"?>
Call pi-attribute
to extract the content
of the pseudo-attribute name
:
<xsl:call-template name="pi-attribute"> <xsl:with-param name="pis" select="processing-instruction('toms-html')"/> <xsl:with-param name="attribute" select="'background-color'"/> </xsl:call-template>
This gives you the result blue
.
Processing instructions (PIs) are usually needed to fine-tune your output formats, e.g., to add page break information, background color, or other stylistic hints. PIs should not be used to insert data that should normally reside inside a DocBook element! As a general rule of thumb: Use PIs if you want to provide layout specific information for your output format unless there is another method.
The following example uses the PI <?toms-html?>
which is included inside a
para
element to insert background color in HTML:[6]
Invent a target name for your processing instruction. This
name should be unique and must not conflict with existing PIs (like
<?dbhtml?>
, <?dbfo?>
, etc.) For
example, you could use your abbreviated name and the output format to
distinguish it from other processing instructions.
Insert your PI into a para that has a different background color:
<para><?toms-html background-color="blue"?> ... </para>
Create a customization layer as shown in Section 2.3, “Writing Customization Layers”.
Customize the para
template and add the
following code to your customization layer. The customized
template calls pi-attribute
with the
relevant parameters. If no PI was set, apply the original
template:
<xsl:template match="d:para"> <xsl:variable name="bg"> <xsl:call-template name="pi-attribute"> <xsl:with-param name="pis" select="processing-instruction('toms-html')"/> <xsl:with-param name="attribute" select="'background-color'"/> </xsl:call-template> </xsl:variable> <xsl:choose> <xsl:when test="$bg != ''"> <div style="background-color:{$bg}"> <xsl:apply-imports/> </div> </xsl:when> <xsl:otherwise> <xsl:apply-imports/> </xsl:otherwise> </xsl:choose> </xsl:template>
Fill the variable | |
Decide what to do when background color is found. | |
Wrap our paragraph around | |
Delegate the default handling to the original
|
Build your document with your customization layer.
The previous example recognizes a PI
inside a para
only. If you also want
to recognize PIs before, use the
following XPath expression in the select
attribute of pi-attribute
:
( processing-instruction('toms-html') | preceding-sibling::processing-instruction('toms-html')[1] )[last()]
If two PIs are available (one inside, another outside), the inside one takes precedence.
[6] Usually, such a requirement would be satisfied by CSS and not PIs. However, this example just shows the principle so it is a perfect use case.
Project@GitHub | Issue#7 |