You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
750 lines
28 KiB
750 lines
28 KiB
<?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="contains($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 replaces all
|
|
occurances of <parameter moreinfo="none">target</parameter> in <parameter moreinfo="none">string</parameter>
|
|
with <parameter moreinfo="none">replacement</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="replacement"></xsl:param>
|
|
|
|
<xsl:choose>
|
|
<xsl:when test="contains($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="replacement" select="$replacement"></xsl:with-param>
|
|
</xsl:call-template>
|
|
</xsl:variable>
|
|
<xsl:value-of select="concat(substring-before($string, $target), $replacement, $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 finds. 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="contains($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="contains($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="contains($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 replaced 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="contains($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 contains 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="contains($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="contains($uriA, '/') and contains($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> |