[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Re: [docbook-apps] applying imports to additional text
----- Original Message -----
From: "Sam Steingold" <sds@gnu.org>
To: <docbook-apps@lists.oasis-open.org>
Sent: Wednesday, March 19, 2008 1:33 PM
Subject: [docbook-apps] applying imports to additional text
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> I want
>
> <literal role="unreadable">foo</literal>
>
> to be processed as if it were written
>
> <literal role="data"><ulink url="...">#<FOO></literal>
>
> I wrote this:
>
> <xsl:param name="clhs.top" select="'http://www.lisp.org/HyperSpec/'"/>
> <xsl:param name="clhs.body" select="'{$clhs.top}Body/'"/>
> <xsl:template match="literal[@role = 'unreadable']">
> ~ <span class="data"><a href="{$clhs.body}sec_2-4-8-20.html">#<</a>
> ~ <xsl:apply-imports/>></span>
> </xsl:template>
>
> it has 2 bugs:
>
> 1. "{$clhs.body}" is expanded to "{$clhs.top}Body/", not to
> "http://www.lisp.org/HyperSpec/Body/" as I want. why?
The {$...} syntax in XSLT is called an attribute value template (AVT), and
it only works in literal output attribute values. In a param, it is treated
as an ordinary string. You want:
<xsl:param name="clhs.body" select="concat($clhs.top, 'Body/')"/>
> 2. the "#<" and ">" are not included in the <code></code> together with
> FOO. How do I make <xsl:apply-imports/> operate on #<FOO> instead of
> just FOO?
You can't. The apply-imports only applies to the current node, not to any
nodeset you might construct in the stylesheet.
However, in this case an alternative is easy. If you look in
html/inline.xsl for literal, you find:
<xsl:template match="literal">
<xsl:call-template name="inline.monoseq"/>
</xsl:template>
And if you look for the template named "inline.monoseq", you find it starts
as follows:
<xsl:template name="inline.monoseq">
<xsl:param name="content">
<xsl:call-template name="anchor"/>
<xsl:call-template name="simple.xlink">
<xsl:with-param name="content">
<xsl:apply-templates/>
</xsl:with-param>
</xsl:call-template>
</xsl:param>
<code>
...
Notice that it has a parameter named "content". You can construct your
content when you pass that parameter and it will then be included inside the
<code> element:
So your custom template can make a direct call to "inline.monoseq" and pass
the assembled content in the param, something like this:
<xsl:template match="literal[@role = 'unreadable']">
<span class="data">
<a href="{$clhs.body}sec_2-4-8-20.html">
<xsl:call-template name="inline.monoseq">
<xsl:with-param name="content">
<xsl:text>#<</xsl:text>
<xsl:apply-templates/>
<xsl:text>></xsl:text>
</xsl:with-param>
</xsl:call-template>
</a>
</span>
</xsl:template>
I use <xsl:text> for the literal text so whitespace is not accidentally
introduced into the output.
Bob Stayton
Sagehill Enterprises
bobs@sagehill.net
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]