From: Michael D. <mik...@us...> - 2004-10-21 12:52:19
|
Update of /cvsroot/nhibernate/nhibernate/doc/reference/support/docbook-xsl/lib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21160/support/docbook-xsl/lib Added Files: ChangeLog lib.xml lib.xsl lib.xweb Log Message: Added all of the support files needed by docbook to build the html. --- NEW FILE: ChangeLog --- 2004-08-11 Robert Stayton <bob...@us...> * lib.xweb: Fixed problem of PI name suffix being matched instead of whole name. 2003-04-05 Adam Di Carlo <adi...@us...> * lib.xweb: a pica is 12 points, rather than a sixth of an inch 2003-03-26 Michael Smith <xm...@us...> * Makefile: wdocbook.xsl obsoleted by w2docbook.xsl, updated globally 2003-03-25 Michael Smith <xm...@us...> * Makefile: reverting wdocbook.xsl -> w2docbook.xsl changes 2003-03-05 Michael Smith <xm...@us...> * Makefile: Wrong filename was breaking build, fixed. Had ../../litprog/wdocbook.xsl but needed ../../litprog/w2docbook.xsl 2002-09-15 Norman Walsh <nw...@us...> * lib.xweb: Fix bug where PIs match the suffix of a name instead of the whole name 2002-06-09 Norman Walsh <nw...@us...> * lib.xweb: Fix bug #496453: make sure comments don't contain illegal chars 2002-05-12 Norman Walsh <nw...@us...> * lib.xweb: Changed default units to px; added length-in-points template 2002-03-25 Norman Walsh <nw...@us...> * .cvsignore: Ignore lib.xsl too * .cvsignore, Makefile, lib.xsl, lib.xweb: Use Literate XML to generate lib.xsl * Makefile: Update documentation build to reflect use of lib.xweb 2002-03-18 Norman Walsh <nw...@us...> * lib.xsl: Replace generate.*.toc and generate.*.lot with single generate.toc parameter. 2002-03-14 Norman Walsh <nw...@us...> * lib.xsl: Whitespace only: change CR/LF back to LF. Norm was a total moron. * lib.xsl: Whitespace changes only: use PC-style CR/LF because Unix clients choke on this far less often than PC clients choke on the reverse. Grrr. 2002-01-09 Norman Walsh <nw...@us...> * lib.xsl: Added length-units template to extract units from lengths 2001-11-28 Norman Walsh <nw...@us...> * lib.xsl: Added pi-attribute template 2001-04-03 Norman Walsh <nw...@us...> * lib.xsl: Documentation fixes 2001-04-02 Norman Walsh <nw...@us...> * lib.xsl: New file. --- NEW FILE: lib.xml --- <?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: lib.xml,v 1.1 2004/10/21 12:52:08 mikedoerfler Exp $ </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('')"></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: lib.xml,v 1.1 2004/10/21 12:52:08 mikedoerfler Exp $ ******************************************************************** 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> --- NEW FILE: lib.xsl --- <?xml version="1.0" encoding="utf-8"?> <!-- ******************************************************************** $Id: lib.xsl,v 1.1 2004/10/21 12:52:08 mikedoerfler Exp $ ******************************************************************** 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 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:src="http://nwalsh.com/xmlns/litprog/fragment" exclude-result-prefixes="src" version="1.0"> <xsl:template name="dot.count"> <!-- Returns the number of "." characters in a string --> <xsl:param name="string"/> <xsl:param name="count" select="0"/> <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 name="count" select="$count+1"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$count"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="copy-string"> <!-- returns 'count' copies of 'string' --> <xsl:param name="string"/> <xsl:param name="count" select="0"/> <xsl:param name="result"/> <xsl:choose> <xsl:when test="$count>0"> <xsl:call-template name="copy-string"> <xsl:with-param name="string" select="$string"/> <xsl:with-param name="count" select="$count - 1"/> <xsl:with-param name="result"> <xsl:value-of select="$result"/> <xsl:value-of select="$string"/> </xsl:with-param> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$result"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="string.subst"> <xsl:param name="string"/> <xsl:param name="target"/> <xsl:param name="replacement"/> <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 name="target" select="$target"/> <xsl:with-param name="replacement" select="$replacement"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="concat(substring-before($string, $target), $replacement, $rest)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$string"/> </xsl:otherwise> </xsl:choose> </xsl:template> <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 name="quote" select="substring($rest, 1, 1)"/> <xsl:value-of select="substring-before(substring-after($xpointer, $quote), $quote)"/> </xsl:when> <xsl:when test="starts-with($xpointer, '#')"> <xsl:value-of select="substring-after($xpointer, '#')"/> </xsl:when> <!-- otherwise it's a pointer to some other document --> </xsl:choose> </xsl:template> <xsl:template name="length-magnitude"> <xsl:param name="length" select="'0pt'"/> <xsl:choose> <xsl:when test="string-length($length) = 0"/> <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:call-template name="length-magnitude"> <xsl:with-param name="length" select="substring($length,2)"/> </xsl:call-template> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="length-units"> <xsl:param name="length" select="'0pt'"/> <xsl:param name="default.units" select="'px'"/> <xsl:variable name="magnitude"> <xsl:call-template name="length-magnitude"> <xsl:with-param name="length" select="$length"/> </xsl:call-template> </xsl:variable> <xsl:variable name="units"> <xsl:value-of select="substring($length, string-length($magnitude)+1)"/> </xsl:variable> <xsl:choose> <xsl:when test="$units = ''"> <xsl:value-of select="$default.units"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$units"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="length-spec"> <xsl:param name="length" select="'0pt'"/> <xsl:param name="default.units" select="'px'"/> <xsl:variable name="magnitude"> <xsl:call-template name="length-magnitude"> <xsl:with-param name="length" select="$length"/> </xsl:call-template> </xsl:variable> <xsl:variable name="units"> <xsl:value-of select="substring($length, string-length($magnitude)+1)"/> </xsl:variable> <xsl:value-of select="$magnitude"/> <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:when> <xsl:when test="$units = ''"> <xsl:value-of select="$default.units"/> </xsl:when> <xsl:otherwise> <xsl:message> <xsl:text>Unrecognized unit of measure: </xsl:text> <xsl:value-of select="$units"/> <xsl:text>.</xsl:text> </xsl:message> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="length-in-points"> <xsl:param name="length" select="'0pt'"/> <xsl:param name="em.size" select="10"/> <xsl:param name="pixels.per.inch" select="90"/> <xsl:variable name="magnitude"> <xsl:call-template name="length-magnitude"> <xsl:with-param name="length" select="$length"/> </xsl:call-template> </xsl:variable> <xsl:variable name="units"> <xsl:value-of select="substring($length, string-length($magnitude)+1)"/> </xsl:variable> <xsl:choose> <xsl:when test="$units = 'pt'"> <xsl:value-of select="$magnitude"/> </xsl:when> <xsl:when test="$units = 'cm'"> <xsl:value-of select="$magnitude div 2.54 * 72.0"/> </xsl:when> <xsl:when test="$units = 'mm'"> <xsl:value-of select="$magnitude div 25.4 * 72.0"/> </xsl:when> <xsl:when test="$units = 'in'"> <xsl:value-of select="$magnitude * 72.0"/> </xsl:when> <xsl:when test="$units = 'pc'"> <xsl:value-of select="$magnitude * 12.0"/> </xsl:when> <xsl:when test="$units = 'px'"> <xsl:value-of select="$magnitude div $pixels.per.inch * 72.0"/> </xsl:when> <xsl:when test="$units = 'em'"> <xsl:value-of select="$magnitude * $em.size"/> </xsl:when> <xsl:otherwise> <xsl:message> <xsl:text>Unrecognized unit of measure: </xsl:text> <xsl:value-of select="$units"/> <xsl:text>.</xsl:text> </xsl:message> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="pi-attribute"> <xsl:param name="pis" select="processing-instruction('')"/> <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:variable> <xsl:variable name="pivalue"> <xsl:value-of select="concat(' ', normalize-space($pi))"/> </xsl:variable> <xsl:choose> <xsl:when test="contains($pivalue,concat(' ', $attribute, '='))"> <xsl:variable name="rest" select="substring-after($pivalue,concat(' ', $attribute,'='))"/> <xsl:variable name="quote" select="substring($rest,1,1)"/> <xsl:value-of select="substring-before(substring($rest,2),$quote)"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="pi-attribute"> <xsl:with-param name="pis" select="$pis"/> <xsl:with-param name="attribute" select="$attribute"/> <xsl:with-param name="count" select="$count + 1"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="lookup.key"> <xsl:param name="key" select="''"/> <xsl:param name="table" select="''"/> <xsl:if test="contains($table, ' ')"> <xsl:choose> <xsl:when test="substring-before($table, ' ') = $key"> <xsl:variable name="rest" select="substring-after($table, ' ')"/> <xsl:choose> <xsl:when test="contains($rest, ' ')"> <xsl:value-of select="substring-before($rest, ' ')"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$rest"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:call-template name="lookup.key"> <xsl:with-param name="key" select="$key"/> <xsl:with-param name="table" select="substring-after(substring-after($table,' '), ' ')"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template> <xsl:template name="xpath.location"> <xsl:param name="node" select="."/> <xsl:param name="path" select="''"/> <xsl:variable name="next.path"> <xsl:value-of select="local-name($node)"/> <xsl:if test="$path != ''">/</xsl:if> <xsl:value-of select="$path"/> </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 name="path" select="$next.path"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:text>/</xsl:text> <xsl:value-of select="$next.path"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="comment-escape-string"> <xsl:param name="string" select="''"/> <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:call-template> <xsl:if test="substring($string, string-length($string), 1) = '-'"> <xsl:text> </xsl:text> </xsl:if> </xsl:template> <xsl:template name="comment-escape-string.recursive"> <xsl:param name="string" select="''"/> <xsl:choose> <xsl:when test="contains($string, '--')"> <xsl:value-of select="substring-before($string, '--')"/> <xsl:value-of select="'- -'"/> <xsl:call-template name="comment-escape-string.recursive"> <xsl:with-param name="string" select="substring-after($string, '--')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$string"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="count.uri.path.depth"> <xsl:param name="filename" select="''"/> <xsl:param name="count" select="0"/> <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 name="count" select="$count + 1"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$count"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="trim.common.uri.paths"> <xsl:param name="uriA" select="''"/> <xsl:param name="uriB" select="''"/> <xsl:param name="return" select="'A'"/> <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 name="uriB" select="substring-after($uriB, '/')"/> <xsl:with-param name="return" select="$return"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:choose> <xsl:when test="$return = 'A'"> <xsl:value-of select="$uriA"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$uriB"/> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> --- NEW FILE: lib.xweb --- <book xmlns:src="http://nwalsh.com/xmlns/litprog/fragment" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <bookinfo> <title>XSL Library Template Reference</title> <releaseinfo role="cvs">$Id: lib.xweb,v 1.1 2004/10/21 12:52:08 mikedoerfler Exp $ </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><src:fragment 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:choose> <xsl:when test="contains($string, '.')"> <xsl:call-template name="dot.count"> <xsl:with-param name="string" select="substring-after($string, '.')"/> <xsl:with-param name="count" select="$count+1"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$count"/> </xsl:otherwise> </xsl:choose> </xsl:template> </src:fragment></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><src:fragment 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 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 name="count" select="$count - 1"/> <xsl:with-param name="result"> <xsl:value-of select="$result"/> <xsl:value-of select="$string"/> </xsl:with-param> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$result"/> </xsl:otherwise> </xsl:choose> </xsl:template> </src:fragment></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>string.subst</function> template replaces all occurances of <parameter>target</parameter> in <parameter>string</parameter> with <parameter>replacement</parameter> and returns the result. </para> <programlisting><src:fragment 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 name="target" select="$target"/> <xsl:with-param name="replacement" select="$replacement"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="concat(substring-before($string, $target), $replacement, $rest)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$string"/> </xsl:otherwise> </xsl:choose> </xsl:template> </src:fragment></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>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>xpointer.idref</function> returns <quote>foo</quote> when passed either <literal>#foo</literal> or <literal>#xpointer(id('foo'))</literal>, otherwise it returns the empty string.</para> <programlisting><src:fragment 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 name="quote" select="substring($rest, 1, 1)"/> <xsl:value-of select="substring-before(substring-after($xpointer, $quote), $quote)"/> </xsl:when> <xsl:when test="starts-with($xpointer, '#')"> <xsl:value-of select="substring-after($xpointer, '#')"/> </xsl:when> <!-- otherwise it's a pointer to some other document --> </xsl:choose> </xsl:template> </src:fragment></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>length-magnitude</function> template returns the unqualified length ("20" for "20pt") from a dimension. </para> <programlisting><src:fragment id='length-magnitude.frag'> <xsl:template name="length-magnitude"> <xsl:param name="length" select="'0pt'"/> <xsl:choose> <xsl:when test="string-length($length) = 0"/> <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:call-template name="length-magnitude"> <xsl:with-param name="length" select="substring($length,2)"/> </xsl:call-template> </xsl:when> </xsl:choose> </xsl:template> </src:fragment></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>length-units</function> template returns the units ("pt" for "20pt") from a length. If no units are supplied on the length, the <parameter>defauilt.units</parameter> are returned.</para> <programlisting><src:fragment id='length-units.frag'> <xsl:template name="length-units"> <xsl:param name="length" select="'0pt'"/> <xsl:param name="default.units" select="'px'"/> <xsl:variable name="magnitude"> <xsl:call-template name="length-magnitude"> <xsl:with-param name="length" select="$length"/> </xsl:call-template> </xsl:variable> <xsl:variable name="units"> <xsl:value-of select="substring($length, string-length($magnitude)+1)"/> </xsl:variable> <xsl:choose> <xsl:when test="$units = ''"> <xsl:value-of select="$default.units"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$units"/> </xsl:otherwise> </xsl:choose> </xsl:template> </src:fragment></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>length-spec</function> template returns the qualified length from a dimension. If an unqualified length is given, the <parameter>default.units</parameter> will be added to it. </para> <programlisting><src:fragment id='length-spec.frag'> <xsl:template name="length-spec"> <xsl:param name="length" select="'0pt'"/> <xsl:param name="default.units" select="'px'"/> <xsl:variable name="magnitude"> <xsl:call-template name="length-magnitude"> <xsl:with-param name="length" select="$length"/> </xsl:call-template> </xsl:variable> <xsl:variable name="units"> <xsl:value-of select="substring($length, string-length($magnitude)+1)"/> </xsl:variable> <xsl:value-of select="$magnitude"/> <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:when> <xsl:when test="$units = ''"> <xsl:value-of select="$default.units"/> </xsl:when> <xsl:otherwise> <xsl:message> <xsl:text>Unrecognized unit of measure: </xsl:text> <xsl:value-of select="$units"/> <xsl:text>.</xsl:text> </xsl:message> </xsl:otherwise> </xsl:choose> </xsl:template> </src:fragment></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>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>em</literal>. It relies on the default <parameter>em.size</parameter> which is initially <literal>10</literal> (for 10pt).</para> <para>Similarly, converting pixesl to points relies on the <parameter>pixels.per.inch</parameter> parameter which is initially <literal>90</literal>. </para> </caution> <programlisting><src:fragment id='length-in-points.frag'> <xsl:template name="length-in-points"> <xsl:param name="length" select="'0pt'"/> <xsl:param name="em.size" select="10"/> <xsl:param name="pixels.per.inch" select="90"/> <xsl:variable name="magnitude"> <xsl:call-template name="length-magnitude"> <xsl:with-param name="length" select="$length"/> </xsl:call-template> </xsl:variable> <xsl:variable name="units"> <xsl:value-of select="substring($length, string-length($magnitude)+1)"/> </xsl:variable> <xsl:choose> <xsl:when test="$units = 'pt'"> <xsl:value-of select="$magnitude"/> </xsl:when> <xsl:when test="$units = 'cm'"> <xsl:value-of select="$magnitude div 2.54 * 72.0"/> </xsl:when> <xsl:when test="$units = 'mm'"> <xsl:value-of select="$magnitude div 25.4 * 72.0"/> </xsl:when> <xsl:when test="$units = 'in'"> <xsl:value-of select="$magnitude * 72.0"/> </xsl:when> <xsl:when test="$units = 'pc'"> <xsl:value-of select="$magnitude * 12.0"/> </xsl:when> <xsl:when test="$units = 'px'"> <xsl:value-of select="$magnitude div $pixels.per.inch * 72.0"/> </xsl:when> <xsl:when test="$units = 'em'"> <xsl:value-of select="$magnitude * $em.size"/> </xsl:when> <xsl:otherwise> <xsl:message> <xsl:text>Unrecognized unit of measure: </xsl:text> <xsl:value-of select="$units"/> <xsl:text>.</xsl:text> </xsl:message> </xsl:otherwise> </xsl:choose> </xsl:template> </src:fragment></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>pi-attribute</function> template extracts a pseudo-attribute from a processing instruction. For example, given the PI <quote><literal><?foo bar="1" baz='red'?></literal></quote>,</para> <programlisting><![CDATA[<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><src:fragment id='pi-attribute.frag'> <xsl:template name="pi-attribute"> <xsl:param name="pis" select="processing-instruction('')"/> <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:variable> <xsl:variable name="pivalue"> <xsl:value-of select="concat(' ', normalize-space($pi))"/> </xsl:variable> <xsl:choose> <xsl:when test="contains($pivalue,concat(' ', $attribute, '='))"> <xsl:variable name="rest" select="substring-after($pivalue,concat(' ', $attribute,'='))"/> <xsl:variable name="quote" select="substring($rest,1,1)"/> <xsl:value-of select="substring-before(substring($rest,2),$quote)"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="pi-attribute"> <xsl:with-param name="pis" select="$pis"/> <xsl:with-param name="attribute" select="$attribute"/> <xsl:with-param name="count" select="$count + 1"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:template> </src:fragment></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>lookup.key</function> template extracts the value associated with a particular key.</para> <programlisting><src:fragment id='lookup.key.frag'> <xsl:template name="lookup.key"> <xsl:param name="key" select="''"/> <xsl:param name="table" select="''"/> <xsl:if test="contains($table, ' ')"> ... [truncated message content] |