OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.


Help: OASIS Mailing Lists Help | MarkMail Help

docbook-apps message

[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

> Hash: SHA1
> I want
> <literal role="unreadable">foo</literal>
> to be processed as if it were written
> <literal role="data"><ulink url="...">#&lt;FOO&gt;</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">#&lt;</a>
> ~  <xsl:apply-imports/>&gt;</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"/>

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

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

I use <xsl:text> for the literal text so whitespace is not accidentally 
introduced into the output.

Bob Stayton
Sagehill Enterprises

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]