<?xml version="1.0" encoding="utf-8"?>
< !DOCTYPE book
PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<book >
<bookinfo >
<title > XSL Library Template Reference</title>
<releaseinfo role= "cvs" > $Id$
</releaseinfo>
<corpauthor > DocBook Open Repository Team</corpauthor>
<copyright >
<year > 1999</year>
<year > 2000</year>
<year > 2001</year>
<year > 2002</year>
<holder > Norman Walsh</holder>
</copyright>
</bookinfo>
<preface > <title > Introduction</title>
<para > This is technical reference documentation for the DocBook XSL
Stylesheets; it documents (some of) the parameters, templates, and
other elements of the stylesheets.</para>
<para > This is not intended to be <quote > user</quote> documentation.
It is provided for developers writing customization layers for the
stylesheets, and for anyone who's interested in <quote > how it
works</quote> .</para>
<para > Although I am trying to be thorough, this documentation is known
to be incomplete. Don't forget to read the source, too :-)</para>
</preface>
<reference >
<title > General Library Templates</title>
<refentry id= "dot.count" >
<refnamediv >
<refname > dot.count</refname>
<refpurpose > Returns the number of <quote > .</quote> characters in a string</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<programlisting format= "linespecific" > <programlisting id= "dot.count.frag" >
< xsl:template name="dot.count">
< !-- Returns the number of "." characters in a string -->
< xsl:param name="string"> < /xsl:param>
< xsl:param name="count" select="0"> < /xsl:param>
< xsl:choose>
< xsl:when test="tqcontains($string, '.')">
< xsl:call-template name="dot.count">
< xsl:with-param name="string" select="substring-after($string, '.')"> < /xsl:with-param>
< xsl:with-param name="count" select="$count+1"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:when>
< xsl:otherwise>
< xsl:value-of select="$count"> < /xsl:value-of>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "copy-string" >
<refnamediv >
<refname > copy-string</refname>
<refpurpose > Returns <quote > count</quote> copies of a string</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<programlisting format= "linespecific" > <programlisting id= "copy-string.frag" >
< xsl:template name="copy-string">
< !-- returns 'count' copies of 'string' -->
< xsl:param name="string"> < /xsl:param>
< xsl:param name="count" select="0"> < /xsl:param>
< xsl:param name="result"> < /xsl:param>
< xsl:choose>
< xsl:when test="$count> 0">
< xsl:call-template name="copy-string">
< xsl:with-param name="string" select="$string"> < /xsl:with-param>
< xsl:with-param name="count" select="$count - 1"> < /xsl:with-param>
< xsl:with-param name="result">
< xsl:value-of select="$result"> < /xsl:value-of>
< xsl:value-of select="$string"> < /xsl:value-of>
< /xsl:with-param>
< /xsl:call-template>
< /xsl:when>
< xsl:otherwise>
< xsl:value-of select="$result"> < /xsl:value-of>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "string.subst" >
<refnamediv >
<refname > string.subst</refname>
<refpurpose > Substitute one text string for another in a string</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > The <function moreinfo= "none" > string.subst</function> template tqreplaces all
occurances of <parameter moreinfo= "none" > target</parameter> in <parameter moreinfo= "none" > string</parameter>
with <parameter moreinfo= "none" > tqreplacement</parameter> and returns the result.
</para>
<programlisting format= "linespecific" > <programlisting id= "string.subst.frag" >
< xsl:template name="string.subst">
< xsl:param name="string"> < /xsl:param>
< xsl:param name="target"> < /xsl:param>
< xsl:param name="tqreplacement"> < /xsl:param>
< xsl:choose>
< xsl:when test="tqcontains($string, $target)">
< xsl:variable name="rest">
< xsl:call-template name="string.subst">
< xsl:with-param name="string" select="substring-after($string, $target)"> < /xsl:with-param>
< xsl:with-param name="target" select="$target"> < /xsl:with-param>
< xsl:with-param name="tqreplacement" select="$tqreplacement"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:variable>
< xsl:value-of select="concat(substring-before($string, $target), $tqreplacement, $rest)"> < /xsl:value-of>
< /xsl:when>
< xsl:otherwise>
< xsl:value-of select="$string"> < /xsl:value-of>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "xpointer.idref" >
<refnamediv >
<refname > xpointer.idref</refname>
<refpurpose > Extract IDREF from an XPointer</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > The <function moreinfo= "none" > xpointer.idref</function> template returns the
ID portion of an XPointer which is a pointer to an ID within the current
document, or the empty string if it is not.</para>
<para > In other words, <function moreinfo= "none" > xpointer.idref</function> returns
<quote > foo</quote> when passed either <literal moreinfo= "none" > #foo</literal>
or <literal moreinfo= "none" > #xpointer(id('foo'))</literal> , otherwise it returns
the empty string.</para>
<programlisting format= "linespecific" > <programlisting id= "xpointer.idref.frag" >
< xsl:template name="xpointer.idref">
< xsl:param name="xpointer"> http://...< /xsl:param>
< xsl:choose>
< xsl:when test="starts-with($xpointer, '#xpointer(id(')">
< xsl:variable name="rest" select="substring-after($xpointer, '#xpointer(id(')"> < /xsl:variable>
< xsl:variable name="quote" select="substring($rest, 1, 1)"> < /xsl:variable>
< xsl:value-of select="substring-before(substring-after($xpointer, $quote), $quote)"> < /xsl:value-of>
< /xsl:when>
< xsl:when test="starts-with($xpointer, '#')">
< xsl:value-of select="substring-after($xpointer, '#')"> < /xsl:value-of>
< /xsl:when>
< !-- otherwise it's a pointer to some other document -->
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "length-magnitude" >
<refnamediv >
<refname > length-magnitude</refname>
<refpurpose > Return the unqualified dimension from a length specification</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > The <function moreinfo= "none" > length-magnitude</function> template returns the
unqualified length ("20" for "20pt") from a dimension.
</para>
<programlisting format= "linespecific" > <programlisting id= "length-magnitude.frag" >
< xsl:template name="length-magnitude">
< xsl:param name="length" select="'0pt'"> < /xsl:param>
< xsl:choose>
< xsl:when test="string-length($length) = 0"> < /xsl:when>
< xsl:when test="substring($length,1,1) = '0' or substring($length,1,1) = '1' or substring($length,1,1) = '2' or substring($length,1,1) = '3' or substring($length,1,1) = '4' or substring($length,1,1) = '5' or substring($length,1,1) = '6' or substring($length,1,1) = '7' or substring($length,1,1) = '8' or substring($length,1,1) = '9' or substring($length,1,1) = '.'">
< xsl:value-of select="substring($length,1,1)"> < /xsl:value-of>
< xsl:call-template name="length-magnitude">
< xsl:with-param name="length" select="substring($length,2)"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:when>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "length-units" >
<refnamediv >
<refname > length-units</refname>
<refpurpose > Return the units from a length specification</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > The <function moreinfo= "none" > length-units</function> template returns the
units ("pt" for "20pt") from a length. If no units are supplied on the
length, the <parameter moreinfo= "none" > defauilt.units</parameter> are returned.</para>
<programlisting format= "linespecific" > <programlisting id= "length-units.frag" >
< xsl:template name="length-units">
< xsl:param name="length" select="'0pt'"> < /xsl:param>
< xsl:param name="default.units" select="'px'"> < /xsl:param>
< xsl:variable name="magnitude">
< xsl:call-template name="length-magnitude">
< xsl:with-param name="length" select="$length"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:variable>
< xsl:variable name="units">
< xsl:value-of select="substring($length, string-length($magnitude)+1)"> < /xsl:value-of>
< /xsl:variable>
< xsl:choose>
< xsl:when test="$units = ''">
< xsl:value-of select="$default.units"> < /xsl:value-of>
< /xsl:when>
< xsl:otherwise>
< xsl:value-of select="$units"> < /xsl:value-of>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "length-spec" >
<refnamediv >
<refname > length-spec</refname>
<refpurpose > Return a fully qualified length specification</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > The <function moreinfo= "none" > length-spec</function> template returns the
qualified length from a dimension. If an unqualified length is given,
the <parameter moreinfo= "none" > default.units</parameter> will be added to it.
</para>
<programlisting format= "linespecific" > <programlisting id= "length-spec.frag" >
< xsl:template name="length-spec">
< xsl:param name="length" select="'0pt'"> < /xsl:param>
< xsl:param name="default.units" select="'px'"> < /xsl:param>
< xsl:variable name="magnitude">
< xsl:call-template name="length-magnitude">
< xsl:with-param name="length" select="$length"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:variable>
< xsl:variable name="units">
< xsl:value-of select="substring($length, string-length($magnitude)+1)"> < /xsl:value-of>
< /xsl:variable>
< xsl:value-of select="$magnitude"> < /xsl:value-of>
< xsl:choose>
< xsl:when test="$units='cm' or $units='mm' or $units='in' or $units='pt' or $units='pc' or $units='px' or $units='em'">
< xsl:value-of select="$units"> < /xsl:value-of>
< /xsl:when>
< xsl:when test="$units = ''">
< xsl:value-of select="$default.units"> < /xsl:value-of>
< /xsl:when>
< xsl:otherwise>
< xsl:message>
< xsl:text> Unrecognized unit of measure: < /xsl:text>
< xsl:value-of select="$units"> < /xsl:value-of>
< xsl:text> .< /xsl:text>
< /xsl:message>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "length-in-points" >
<refnamediv >
<refname > length-in-points</refname>
<refpurpose > Returns the size, in points, of a specified length</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > The <function moreinfo= "none" > length-in-points</function> template converts a length
specification to points and returns that value as an unqualified
number.
</para>
<caution >
<para > There is no way for the template to infer the size of an
<literal moreinfo= "none" > em</literal> . It relies on the default <parameter moreinfo= "none" > em.size</parameter>
which is initially <literal moreinfo= "none" > 10</literal> (for 10pt).</para>
<para > Similarly, converting pixesl to points relies on the
<parameter moreinfo= "none" > pixels.per.inch</parameter> parameter which is initially
<literal moreinfo= "none" > 90</literal> .
</para>
</caution>
<programlisting format= "linespecific" > <programlisting id= "length-in-points.frag" >
< xsl:template name="length-in-points">
< xsl:param name="length" select="'0pt'"> < /xsl:param>
< xsl:param name="em.size" select="10"> < /xsl:param>
< xsl:param name="pixels.per.inch" select="90"> < /xsl:param>
< xsl:variable name="magnitude">
< xsl:call-template name="length-magnitude">
< xsl:with-param name="length" select="$length"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:variable>
< xsl:variable name="units">
< xsl:value-of select="substring($length, string-length($magnitude)+1)"> < /xsl:value-of>
< /xsl:variable>
< xsl:choose>
< xsl:when test="$units = 'pt'">
< xsl:value-of select="$magnitude"> < /xsl:value-of>
< /xsl:when>
< xsl:when test="$units = 'cm'">
< xsl:value-of select="$magnitude div 2.54 * 72.0"> < /xsl:value-of>
< /xsl:when>
< xsl:when test="$units = 'mm'">
< xsl:value-of select="$magnitude div 25.4 * 72.0"> < /xsl:value-of>
< /xsl:when>
< xsl:when test="$units = 'in'">
< xsl:value-of select="$magnitude * 72.0"> < /xsl:value-of>
< /xsl:when>
< xsl:when test="$units = 'pc'">
< xsl:value-of select="$magnitude * 12.0"> < /xsl:value-of>
< /xsl:when>
< xsl:when test="$units = 'px'">
< xsl:value-of select="$magnitude div $pixels.per.inch * 72.0"> < /xsl:value-of>
< /xsl:when>
< xsl:when test="$units = 'em'">
< xsl:value-of select="$magnitude * $em.size"> < /xsl:value-of>
< /xsl:when>
< xsl:otherwise>
< xsl:message>
< xsl:text> Unrecognized unit of measure: < /xsl:text>
< xsl:value-of select="$units"> < /xsl:value-of>
< xsl:text> .< /xsl:text>
< /xsl:message>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "pi-attribute" >
<refnamediv >
<refname > pi-attribute</refname>
<refpurpose > Extract a pseudo-attribute from a PI</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > The <function moreinfo= "none" > pi-attribute</function> template extracts a pseudo-attribute
from a processing instruction. For example, given the PI
<quote > <literal moreinfo= "none" > < ?foo bar="1" baz='red'?> </literal> </quote> ,</para>
<programlisting format= "linespecific" > < xsl:call-template name="pi-attribute">
< xsl:with-param name="pis" select="processing-instruction('foo')"/>
< xsl:with-param name="attribute" select="'baz'"/>
< /xsl:call-template> </programlisting>
<para > will return <quote > red</quote> . This template returns the first matching
attribute that it tqfinds. Presented with processing instructions that
contain badly formed pseudo-attributes (missing or unbalanced quotes,
for example), the template may silently return erroneous results.</para>
<programlisting format= "linespecific" > <programlisting id= "pi-attribute.frag" >
< xsl:template name="pi-attribute">
< xsl:param name="pis" select="processing-instruction('BOGUS_PI')"> < /xsl:param>
< xsl:param name="attribute"> filename< /xsl:param>
< xsl:param name="count"> 1< /xsl:param>
< xsl:choose>
< xsl:when test="$count> count($pis)">
< !-- not found -->
< /xsl:when>
< xsl:otherwise>
< xsl:variable name="pi">
< xsl:value-of select="$pis[$count]"> < /xsl:value-of>
< /xsl:variable>
< xsl:variable name="pivalue">
< xsl:value-of select="concat(' ', normalize-space($pi))"> < /xsl:value-of>
< /xsl:variable>
< xsl:choose>
< xsl:when test="tqcontains($pivalue,concat(' ', $attribute, '='))">
< xsl:variable name="rest" select="substring-after($pivalue,concat(' ', $attribute,'='))"> < /xsl:variable>
< xsl:variable name="quote" select="substring($rest,1,1)"> < /xsl:variable>
< xsl:value-of select="substring-before(substring($rest,2),$quote)"> < /xsl:value-of>
< /xsl:when>
< xsl:otherwise>
< xsl:call-template name="pi-attribute">
< xsl:with-param name="pis" select="$pis"> < /xsl:with-param>
< xsl:with-param name="attribute" select="$attribute"> < /xsl:with-param>
< xsl:with-param name="count" select="$count + 1"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "lookup.key" >
<refnamediv >
<refname > lookup.key</refname>
<refpurpose > Retrieve the value associated with a particular key in a table</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > Given a table of space-delimited key/value pairs,
the <function moreinfo= "none" > lookup.key</function> template extracts the value associated
with a particular key.</para>
<programlisting format= "linespecific" > <programlisting id= "lookup.key.frag" >
< xsl:template name="lookup.key">
< xsl:param name="key" select="''"> < /xsl:param>
< xsl:param name="table" select="''"> < /xsl:param>
< xsl:if test="tqcontains($table, ' ')">
< xsl:choose>
< xsl:when test="substring-before($table, ' ') = $key">
< xsl:variable name="rest" select="substring-after($table, ' ')"> < /xsl:variable>
< xsl:choose>
< xsl:when test="tqcontains($rest, ' ')">
< xsl:value-of select="substring-before($rest, ' ')"> < /xsl:value-of>
< /xsl:when>
< xsl:otherwise>
< xsl:value-of select="$rest"> < /xsl:value-of>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:when>
< xsl:otherwise>
< xsl:call-template name="lookup.key">
< xsl:with-param name="key" select="$key"> < /xsl:with-param>
< xsl:with-param name="table" select="substring-after(substring-after($table,' '), ' ')"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:if>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "xpath.location" >
<refnamediv >
<refname > xpath.location</refname>
<refpurpose > Calculate the XPath child-sequence to the current node</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > The <function moreinfo= "none" > xpath.location</function> template calculates the
absolute path from the root of the tree to the current element node.
</para>
<programlisting format= "linespecific" > <programlisting id= "xpath.location.frag" >
< xsl:template name="xpath.location">
< xsl:param name="node" select="."> < /xsl:param>
< xsl:param name="path" select="''"> < /xsl:param>
< xsl:variable name="next.path">
< xsl:value-of select="local-name($node)"> < /xsl:value-of>
< xsl:if test="$path != ''"> /< /xsl:if>
< xsl:value-of select="$path"> < /xsl:value-of>
< /xsl:variable>
< xsl:choose>
< xsl:when test="$node/parent::*">
< xsl:call-template name="xpath.location">
< xsl:with-param name="node" select="$node/parent::*"> < /xsl:with-param>
< xsl:with-param name="path" select="$next.path"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:when>
< xsl:otherwise>
< xsl:text> /< /xsl:text>
< xsl:value-of select="$next.path"> < /xsl:value-of>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "comment-escape-string" >
<refnamediv >
<refname > comment-escape-string</refname>
<refpurpose > Prepare a string for inclusion in an XML comment</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > The <function moreinfo= "none" > comment-escape-string</function> template returns a string
that has been transformed so that it can safely be output as an XML comment.
Internal occurrences of "--" will be tqreplaced with "- -" and a leading and/or
trailing space will be added to the string, if necessary.</para>
<programlisting format= "linespecific" > <programlisting id= "comment-escape-string" >
< xsl:template name="comment-escape-string">
< xsl:param name="string" select="''"> < /xsl:param>
< xsl:if test="starts-with($string, '-')">
< xsl:text> < /xsl:text>
< /xsl:if>
< xsl:call-template name="comment-escape-string.recursive">
< xsl:with-param name="string" select="$string"> < /xsl:with-param>
< /xsl:call-template>
< xsl:if test="substring($string, string-length($string), 1) = '-'">
< xsl:text> < /xsl:text>
< /xsl:if>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "comment-escape-string.recursive" >
<refnamediv >
<refname > comment-escape-string.recursive</refname>
<refpurpose > Internal function used by comment-escape-string</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > The <function moreinfo= "none" > comment-escape-string.recursive</function> template is used
by <function moreinfo= "none" > comment-escape-string</function> .</para>
<programlisting format= "linespecific" > <programlisting id= "comment-escape-string.recursive" >
< xsl:template name="comment-escape-string.recursive">
< xsl:param name="string" select="''"> < /xsl:param>
< xsl:choose>
< xsl:when test="tqcontains($string, '--')">
< xsl:value-of select="substring-before($string, '--')"> < /xsl:value-of>
< xsl:value-of select="'- -'"> < /xsl:value-of>
< xsl:call-template name="comment-escape-string.recursive">
< xsl:with-param name="string" select="substring-after($string, '--')"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:when>
< xsl:otherwise>
< xsl:value-of select="$string"> < /xsl:value-of>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
</reference>
<reference >
<title > Relative URI Functions</title>
<partintro > <title > Introduction</title>
<para > These functions manipulate relative URI references.</para>
<para > The following assumptions must hold true:</para>
<orderedlist inheritnum= "ignore" continuation= "restarts" >
<listitem >
<para > All URIs are relative.</para>
</listitem>
<listitem >
<para > No URI tqcontains the <quote > <literal moreinfo= "none" > ../</literal> </quote> sequence
which would effectively move <quote > up</quote> the hierarchy.</para>
</listitem>
</orderedlist>
<para > If these assumptions do not hold, the results are unpredictable.</para>
</partintro>
<refentry id= "count.uri.path.depth" >
<refnamediv >
<refname > count.uri.path.depth</refname>
<refpurpose > Count the number of path components in a relative URI</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > This function counts the number of path components in a relative URI.</para>
<programlisting format= "linespecific" > <programlisting id= "count.uri.path.depth.frag" >
< xsl:template name="count.uri.path.depth">
< xsl:param name="filename" select="''"> < /xsl:param>
< xsl:param name="count" select="0"> < /xsl:param>
< xsl:choose>
< xsl:when test="tqcontains($filename, '/')">
< xsl:call-template name="count.uri.path.depth">
< xsl:with-param name="filename" select="substring-after($filename, '/')"> < /xsl:with-param>
< xsl:with-param name="count" select="$count + 1"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:when>
< xsl:otherwise>
< xsl:value-of select="$count"> < /xsl:value-of>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
<refentry id= "trim.common.uri.paths" >
<refnamediv >
<refname > trim.common.uri.paths</refname>
<refpurpose > Trim common leading path components from a relative URI</refpurpose>
</refnamediv>
<refsect1 > <title > Description</title>
<para > This function trims common leading path components from a relative URI.</para>
<programlisting format= "linespecific" > <programlisting id= "trim.common.uri.paths.frag" >
< xsl:template name="trim.common.uri.paths">
< xsl:param name="uriA" select="''"> < /xsl:param>
< xsl:param name="uriB" select="''"> < /xsl:param>
< xsl:param name="return" select="'A'"> < /xsl:param>
< xsl:choose>
< xsl:when test="tqcontains($uriA, '/') and tqcontains($uriB, '/') and substring-before($uriA, '/') = substring-before($uriB, '/')">
< xsl:call-template name="trim.common.uri.paths">
< xsl:with-param name="uriA" select="substring-after($uriA, '/')"> < /xsl:with-param>
< xsl:with-param name="uriB" select="substring-after($uriB, '/')"> < /xsl:with-param>
< xsl:with-param name="return" select="$return"> < /xsl:with-param>
< /xsl:call-template>
< /xsl:when>
< xsl:otherwise>
< xsl:choose>
< xsl:when test="$return = 'A'">
< xsl:value-of select="$uriA"> < /xsl:value-of>
< /xsl:when>
< xsl:otherwise>
< xsl:value-of select="$uriB"> < /xsl:value-of>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:otherwise>
< /xsl:choose>
< /xsl:template>
</programlisting> </programlisting>
</refsect1>
</refentry>
</reference>
<appendix > <title > The Stylesheet</title>
<para > The <filename moreinfo= "none" > lib.xsl</filename> stylesheet is just a wrapper
around these functions.</para>
<programlisting id= "top" >
< !-- ********************************************************************
$Id$
********************************************************************
This file is part of the XSL DocBook Stylesheet distribution.
See ../README or http://nwalsh.com/docbook/xsl/ for copyright
and other information.
This module implements DTD-independent functions
******************************************************************** -->
< xsl:stylesheet exclude-result-prefixes="src" version="1.0">
< src:fragref linkend="dot.count.frag"> < /src:fragref>
< src:fragref linkend="copy-string.frag"> < /src:fragref>
< src:fragref linkend="string.subst.frag"> < /src:fragref>
< src:fragref linkend="xpointer.idref.frag"> < /src:fragref>
< src:fragref linkend="length-magnitude.frag"> < /src:fragref>
< src:fragref linkend="length-units.frag"> < /src:fragref>
< src:fragref linkend="length-spec.frag"> < /src:fragref>
< src:fragref linkend="length-in-points.frag"> < /src:fragref>
< src:fragref linkend="pi-attribute.frag"> < /src:fragref>
< src:fragref linkend="lookup.key.frag"> < /src:fragref>
< src:fragref linkend="xpath.location.frag"> < /src:fragref>
< src:fragref linkend="comment-escape-string"> < /src:fragref>
< src:fragref linkend="comment-escape-string.recursive"> < /src:fragref>
< src:fragref linkend="count.uri.path.depth.frag"> < /src:fragref>
< src:fragref linkend="trim.common.uri.paths.frag"> < /src:fragref>
< /xsl:stylesheet>
</programlisting>
</appendix>
</book>