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] xsl & unix functions


Sam Steingold wrote:

> 1. this works, but is not too good because this is HTML-specific.
>    I want the element wrapped in <ulink> and then XSL re-applied.
>    (to avoid infinite recursion, one would have to strip 'role="unix"'
>    from the function element before re-application)

There is one easy way how to implement this by misusing profiling 
stylesheets (this is possible because internally profiling stylesheets 
does two passes over input document). Just use profile-docbook.xsl 
instead of docbook.xsl and put something like this into customization layer:

<xsl:template match="function[@role='unix']" mode="profile">
   <ulink url="{$unix.top}/functions/{.}">
     <xsl:copy-of select="."/>
   </ulink>
</xsl:template>

> 2. the exact same thing has to be done with variables, but
>    <xsl:template match="function[@role='unix'] or varname[@role='unix']">
>    does not work.
>    what do I do?

Use | instead of or. "or" cast is operand to boolean and is thus useles 
in match patterns. "|" in match patterns is like having two separate 
identical templates for each operand of "|".

> 3. <filename role="unix">sys/socket.h</filename>
>    must be rendered with a link to
>    "$unix.top"/basedefs/syssocket.h.html
>    i.e., I need to strip "/" from "sys/socket.h"?
>    also, I want it to be rendered as if it were written
>    <filename>&lt;sys/socket.h&gt;</filename>
>    (but I do not want to have to enter the &lt;/&gt; inside <filename>)

Use same trick as above:

<xsl:template match="filename[@role='unix']" mode="profile">
   <ulink url="{$unix.top}/basedefs/{string-after(., '/')}">
     <xsl:copy>
       <xsl:copy-of select="@*"/>
       <xsl:text>&lt;</xsl:text>
       <xsl:apply-templates select="node()"/>
       <xsl:text>></xsl:text>
     </xsl:copy>
   </ulink>
</xsl:template>

> 4. suppose the URL cannot be inferred from the element contents easily,
>    instead I have a table: a file "map" where odd lines are link content
>    and even lines are URLs.  I guess I need to read the file into a hash
>    table and do somthing like this:
> 
> (defparameter *map* (make-hash-table :test 'equal))
> ;; read map:
> (with-open-file (in "map")
>   (loop for s1 = (read-line in nil nil) for s2 = (read-line in nil nil)
>     while (and s1 s2)
>     do (setf (gethash s1 *map*) s2)))
> ;; process <function role="clhs">FOO</function>
> (let ((destination (gethash <xsl:value-of select="."/> *map*)))
>   (if destination
>       <ulink url="destination">
>        (apply-imports <function><xsl:value-of select="."/></function>)
>       </ulink>
>       (error "unknown function")))
> 
> how do I express this in XSL?

Create mapping in form of XML file. Something like:

<!-- map.xml file -->
<map>
   <data from="/foo/bar" to="fuu/baz"/>
   ....
</map>

To do mapping from "/foo/bar" you will just use simple XPath expression 
like:

document("map.xml")/map/data[@from = '/foo/bar']/@to

(Yep, sometimes XSLT+XPath way is really easier then DSSSL one. 
Sometimes not ;)

You can define xsl:key to speedup lookups.

HTH,

					Jirka 			

-- 
------------------------------------------------------------------
   Jirka Kosek     e-mail: jirka@kosek.cz     http://www.kosek.cz
------------------------------------------------------------------
   Profesionální školení a poradenství v oblasti technologií XML.
      Podívejte se na náš nově spuštěný web http://DocBook.cz
        Podrobný přehled školení http://xmlguru.cz/skoleni/
------------------------------------------------------------------

S/MIME Cryptographic Signature



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