| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800 | <?xml version='1.0'?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                xmlns:date="http://exslt.org/dates-and-times"                xmlns:exsl="http://exslt.org/common"                exclude-result-prefixes="date exsl"                version='1.0'><!-- ********************************************************************     $Id: info.xsl 7883 2008-03-08 17:59:39Z xmldoc $     ********************************************************************     This file is part of the XSL DocBook Stylesheet distribution.     See ../README or http://docbook.sf.net/release/xsl/current/ for     copyright and other information.     ******************************************************************** -->  <xsl:variable name="blurb-indent">    <xsl:choose>      <xsl:when test="not($man.indent.blurbs = 0)">        <xsl:value-of select="$man.indent.width"/>      </xsl:when>      <xsl:when test="not($man.indent.refsect = 0)">        <!-- * "zq" is the name of a register we set for -->        <!-- * preserving the original default indent value -->        <!-- * when $man.indent.refsect is non-zero; -->        <!-- * "u" is a roff unit specifier -->        <xsl:text>\n(zqu</xsl:text>      </xsl:when>      <xsl:otherwise/> <!-- * otherwise, just leave it empty -->    </xsl:choose>  </xsl:variable>  <!-- ================================================================== -->  <!-- * About the $info param used in this stylesheet -->  <!-- * -->  <!-- * The $info param is a "master info" node set that contains -->  <!-- * the entire contents of the *info child of the current -->  <!-- * Refentry, plus the entire contents of the *info children of -->  <!-- * all ancestors of the current Refentry, in document order. -->  <!-- * -->  <!-- * We try to find a "best match" for selecting content from -->  <!-- * $infor; we look through it in reverse document order until we -->  <!-- * can find something usable. -->  <!-- * -->  <!-- * Specifically what the basic metadata-gathering XPath expression -->  <!-- * in this stylesheet does is: -->  <!-- * -->  <!-- *   1. Look through the entire "master info" node set.-->  <!-- *   2. Get the last node in the set that contains, for -->  <!-- *      example, an Author element. That amounts to being the -->  <!-- *      closest *info node to the Refentry - either its *info -->  <!-- *      child, or the *info node of its closest ancestor that -->  <!-- *      contains an Author. -->  <!-- ================================================================== -->  <!-- * Get user "refentry metadata" preferences -->  <!-- ================================================================== -->  <!-- * The DocBook XSL stylesheets include several user-configurable -->  <!-- * global stylesheet parameters for controlling refentry metadata -->  <!-- * gathering. Those parameters are not read directly by the other -->  <!-- * refentry metadata-gathering templates. Instead, they are read -->  <!-- * only by the get.refentry.metadata.prefs template, which -->  <!-- * assembles them into a structure that is then passed to the -->  <!-- * other refentry metadata-gathering template. -->  <xsl:variable name="get.refentry.metadata.prefs">    <!-- * get.refentry.metadata.prefs is in common/refentry.xsl -->    <xsl:call-template name="get.refentry.metadata.prefs"/>  </xsl:variable>  <xsl:variable name="refentry.metadata.prefs"                select="exsl:node-set($get.refentry.metadata.prefs)"/>    <!-- * ============================================================== -->  <!-- *    Get content for Author metadata field. -->  <!-- * ============================================================== -->  <!-- * The make.roff.metatada.author template and metadata.author -->  <!-- * mode are used only for populating the Author field in the -->  <!-- * metadata "top comment" we embed in roff source of each page. -->  <xsl:template name="make.roff.metadata.author">    <xsl:param name="info"/>    <xsl:param name="refname"/>    <xsl:choose>      <xsl:when test="$info//author">        <xsl:apply-templates            select="(($info[//author])[last()]//author)[1]"            mode="metadata.author"/>      </xsl:when>      <xsl:when test="$info//corpauthor">        <xsl:apply-templates            select="(($info[//corpauthor])[last()]//corpauthor)[1]"            mode="metadata.author"/>      </xsl:when>      <xsl:when test="$info//editor">        <xsl:apply-templates            select="(($info[//editor])[last()]//editor)[1]"            mode="metadata.author"/>      </xsl:when>      <xsl:when test="$info//corpcredit">        <xsl:apply-templates            select="(($info[//corpcredit])[last()]//corpcredit)[1]"            mode="metadata.author"/>      </xsl:when>      <xsl:when test="$info//othercredit">        <xsl:apply-templates            select="(($info[//othercredit])[last()]//othercredit)[1]"            mode="metadata.author"/>      </xsl:when>      <xsl:when test="$info//collab">        <xsl:apply-templates            select="(($info[//collab])[last()]//collab)[1]"            mode="metadata.author"/>      </xsl:when>      <xsl:when test="$info//orgname">        <xsl:apply-templates            select="(($info[//orgname])[last()]//orgname)[1]"            mode="metadata.author"/>      </xsl:when>      <xsl:when test="$info//publishername">        <xsl:apply-templates            select="(($info[//publishername])[last()]//publishername)[1]"            mode="metadata.author"/>      </xsl:when>      <xsl:otherwise>        <!-- * otherwise, we need to check to see if we have an "Author" -->        <!-- * or "Authors" section in the refentry -->        <xsl:variable name="gentext.author">          <xsl:text>"</xsl:text>          <xsl:call-template name="gentext">            <xsl:with-param name="key" select="'Author'"/>          </xsl:call-template>          <xsl:text>"</xsl:text>        </xsl:variable>        <xsl:variable name="gentext.AUTHOR">          <xsl:if test="not($gentext.author = '')">            <xsl:call-template name="string.upper">              <xsl:with-param name="string" select="$gentext.author"/>            </xsl:call-template>          </xsl:if>        </xsl:variable>        <xsl:variable name="gentext.authors">          <xsl:text>"</xsl:text>          <xsl:call-template name="gentext">            <xsl:with-param name="key" select="'Authors'"/>          </xsl:call-template>          <xsl:text>"</xsl:text>        </xsl:variable>        <xsl:variable name="gentext.AUTHORS">          <xsl:if test="not($gentext.authors = '')">            <xsl:call-template name="string.upper">              <xsl:with-param name="string" select="$gentext.authors"/>            </xsl:call-template>          </xsl:if>        </xsl:variable>        <!-- * get all refentry/refsect1/title & refentry/refsection/title -->        <!-- * instances, delimit each with double quotes, and put them -->        <!-- * into a single refsect1.titles string -->        <xsl:variable name="refsect1.titles">          <xsl:for-each select="refsect1/title">            <xsl:text>"</xsl:text>            <xsl:value-of select="normalize-space(.)"/>            <xsl:text>"</xsl:text>            <xsl:text> </xsl:text>          </xsl:for-each>          <xsl:for-each select="refsection/title">            <xsl:text>"</xsl:text>            <xsl:value-of select="normalize-space(.)"/>            <xsl:text>"</xsl:text>            <xsl:text> </xsl:text>          </xsl:for-each>        </xsl:variable>        <xsl:variable name="author.section.title">          <xsl:choose>            <xsl:when test="not($gentext.authors = '') and              contains($refsect1.titles,$gentext.authors)">              <xsl:value-of select="$gentext.authors"/>            </xsl:when>            <xsl:when test="not($gentext.AUTHORS = '') and              contains($refsect1.titles,$gentext.AUTHORS)">              <xsl:value-of select="$gentext.AUTHORS"/>            </xsl:when>            <xsl:when test="not($gentext.author = '') and              contains($refsect1.titles,$gentext.author)">              <xsl:value-of select="$gentext.author"/>            </xsl:when>            <xsl:when test="not($gentext.AUTHOR = '') and              contains($refsect1.titles,$gentext.AUTHOR)">              <xsl:value-of select="$gentext.AUTHOR"/>            </xsl:when>            <!-- * git docs (for one) use "DOCUMENTATION" for their authors section -->            <xsl:when test="contains($refsect1.titles,'Documentation')">              <xsl:text>Documentation</xsl:text>            </xsl:when>            <xsl:when test="contains($refsect1.titles,'DOCUMENTATION')">              <xsl:text>DOCUMENTATION</xsl:text>            </xsl:when>            <xsl:otherwise/> <!-- * otherwise, leave empty -->          </xsl:choose>        </xsl:variable>        <xsl:choose>          <xsl:when test="not($author.section.title = '')">            <!-- * if we have a non-empty $author.section.title value, -->            <!-- * then reference that title (instead of putting a -->            <!-- * specific author name) -->            <xsl:text>[see the </xsl:text>            <xsl:value-of select="$author.section.title"/>            <xsl:text> section]</xsl:text>          </xsl:when>          <xsl:otherwise>            <!-- * otherwise we have no info/author content and no Author -->            <!-- * or Authors section, so we insert a fixme and report -->            <!-- * the problem to the user -->            <xsl:text>[FIXME: author] [see http://docbook.sf.net/el/author]</xsl:text>            <xsl:if test="$refentry.meta.get.quietly = 0">              <xsl:call-template name="log.message">                <xsl:with-param name="level">Warn</xsl:with-param>                <xsl:with-param name="source" select="$refname"/>                <xsl:with-param name="context-desc">meta author</xsl:with-param>                <xsl:with-param name="message">                  <xsl:text>no refentry/info/author</xsl:text>                </xsl:with-param>              </xsl:call-template>              <xsl:call-template name="log.message">                <xsl:with-param name="level">Note</xsl:with-param>                <xsl:with-param name="source" select="$refname"/>                <xsl:with-param name="context-desc">meta author</xsl:with-param>                <xsl:with-param name="message">                  <xsl:text>see http://docbook.sf.net/el/author</xsl:text>                </xsl:with-param>              </xsl:call-template>              <xsl:call-template name="log.message">                <xsl:with-param name="level">Warn</xsl:with-param>                <xsl:with-param name="source" select="$refname"/>                <xsl:with-param name="context-desc">meta author</xsl:with-param>                <xsl:with-param name="message">                  <xsl:text>no author data, so inserted a fixme</xsl:text>                </xsl:with-param>              </xsl:call-template>            </xsl:if>          </xsl:otherwise>        </xsl:choose>      </xsl:otherwise>    </xsl:choose>  </xsl:template>  <xsl:template match="author|editor|othercredit|collab" mode="metadata.author">    <xsl:choose>      <xsl:when test="collabname">        <!-- * If this node is a Collab, then it should have a -->        <!-- * Collabname child, so get that. -->        <xsl:variable name="contents">          <xsl:apply-templates select="collabname"/>        </xsl:variable>        <xsl:value-of select="normalize-space($contents)"/>      </xsl:when>      <xsl:otherwise>        <!-- * Otherwise, this node is not a Collab, but instead -->        <!-- * an author|editor|othercredit, which must have a name -->        <!-- * of some kind; so get that name -->        <xsl:call-template name="person.name.normalized"/>      </xsl:otherwise>    </xsl:choose>    <xsl:if test=".//email|address/otheraddr/ulink">      <xsl:text> </xsl:text>      <!-- * For each attribution found, use only the first e-mail -->      <!-- * address or ulink value found -->      <xsl:apply-templates select="(.//email|address/otheraddr/ulink)[1]"                           mode="metadata.author"/>    </xsl:if>  </xsl:template>  <xsl:template match="email|address/otheraddr/ulink" mode="metadata.author">    <xsl:text><</xsl:text>    <xsl:choose>      <xsl:when test="self::email">        <xsl:variable name="contents">          <xsl:apply-templates/>        </xsl:variable>        <xsl:value-of select="normalize-space($contents)"/>      </xsl:when>      <xsl:when test="self::ulink">        <xsl:variable name="contents">          <xsl:apply-templates select="."/>        </xsl:variable>        <xsl:value-of select="normalize-space($contents)"/>      </xsl:when>    </xsl:choose>    <xsl:text>></xsl:text>  </xsl:template>  <xsl:template match="corpauthor|corpcredit|orgname|publishername" mode="metadata.author">    <xsl:variable name="contents">      <xsl:apply-templates/>    </xsl:variable>    <xsl:value-of select="normalize-space($contents)"/>  </xsl:template>  <!-- * ============================================================== -->  <!-- *     Assemble the AUTHOR/AUTHORS section -->  <!-- * ============================================================== -->  <xsl:template name="author.section">    <xsl:param name="info"/>    <!-- * The $info param is a "master info" node set that contains -->    <!-- * the entires contents of the *info child of the current -->    <!-- * Refentry, plus the entire contents of the *info children of -->    <!-- * all ancestors of the current Refentry, in document order. -->    <xsl:choose>      <xsl:when test="$info//author|$info//editor|$info//collab|                      $info//corpauthor|$info//corpcredit|                      $info//othercredit|$info/orgname|                      $info/publishername|$info/publisher">        <xsl:variable name="authorcount">          <xsl:value-of              select="count(                      $info//author|$info//editor|$info//collab|                      $info//corpauthor|$info//corpcredit|                      $info//othercredit)">          </xsl:value-of>        </xsl:variable>        <xsl:call-template name="make.subheading">          <xsl:with-param name="title">            <xsl:call-template name="make.authorsecttitle">              <xsl:with-param name="authorcount" select="$authorcount"/>            </xsl:call-template>          </xsl:with-param>        </xsl:call-template>        <!-- * Now output all the actual author, editor, etc. content -->        <xsl:for-each          select="$info//author|$info//editor|$info//collab|          $info//corpauthor|$info//corpcredit|          $info//othercredit|$info/orgname|          $info/publishername|$info/publisher">          <xsl:apply-templates select="." mode="authorsect"/>        </xsl:for-each>      </xsl:when>      <xsl:otherwise/> <!-- * do nothing, no author info found -->    </xsl:choose>  </xsl:template>  <xsl:template name="make.authorsecttitle">    <!-- * If we have exactly one attributable person/entity, then output -->    <!-- * localized gentext for 'Author'; otherwise, output 'Authors'. -->    <xsl:param name="authorcount"/>    <xsl:param name="authorsecttitle">      <xsl:choose>        <xsl:when test="$authorcount = 1">          <xsl:text>Author</xsl:text>        </xsl:when>        <xsl:otherwise>          <xsl:text>Authors</xsl:text>        </xsl:otherwise>      </xsl:choose>    </xsl:param>    <xsl:call-template name="gentext">      <xsl:with-param name="key" select="$authorsecttitle"/>    </xsl:call-template>  </xsl:template>  <xsl:template match="author|editor|othercredit" mode="authorsect">    <xsl:variable name="person-name">      <xsl:call-template name="person.name.normalized"/>    </xsl:variable>    <!-- * If we have a person-name or email or ulink content, then -->    <!-- * output name and email or ulink content on the same line -->    <xsl:choose>      <xsl:when test="not($person-name = '') or .//email or address/otheraddr/ulink">        <xsl:text>.PP
</xsl:text>        <!-- * Display person name in bold -->        <xsl:call-template name="bold">          <xsl:with-param name="node" select="exsl:node-set($person-name)"/>          <xsl:with-param name="context" select="."/>        </xsl:call-template>        <!-- * Display e-mail address(es) and ulink(s) on same line as name -->        <xsl:apply-templates select=".//email|address/otheraddr/ulink" mode="authorsect"/>        <xsl:text>
</xsl:text>      </xsl:when>      <xsl:otherwise>        <xsl:text>.br
</xsl:text>      </xsl:otherwise>    </xsl:choose>    <!-- * Display affiliation(s) on separate lines -->    <xsl:apply-templates select="affiliation" mode="authorsect"/>    <!-- * Display direct-child addresses on separate lines -->    <xsl:apply-templates select="address" mode="authorsect"/>    <!-- * Call template for handling various attribution possibilities -->    <xsl:call-template name="attribution">      <xsl:with-param name="person-name" select="$person-name"/>    </xsl:call-template>  </xsl:template>  <xsl:template match="collab" mode="authorsect">    <xsl:text>.PP
</xsl:text>    <xsl:call-template name="bold">      <xsl:with-param name="node" select="collabname"/>      <xsl:with-param name="context" select="."/>    </xsl:call-template>    <!-- * Display e-mail address(es) and ulink(s) on same line as name -->    <xsl:apply-templates select=".//email|address/otheraddr/ulink" mode="authorsect"/>    <xsl:text>
</xsl:text>    <!-- * Display affilition(s) on separate lines -->    <xsl:apply-templates select="affiliation" mode="authorsect"/>  </xsl:template>  <xsl:template match="corpauthor|corpcredit|orgname|publishername" mode="authorsect">    <xsl:text>.PP
</xsl:text>    <xsl:call-template name="bold">      <xsl:with-param name="node" select="."/>      <xsl:with-param name="context" select="."/>    </xsl:call-template>    <xsl:text>
</xsl:text>    <xsl:if test="self::publishername">      <!-- * Display localized "Publisher" gentext -->      <xsl:call-template name="publisher.attribution"/>    </xsl:if>  </xsl:template>  <xsl:template match="publisher" mode="authorsect">    <xsl:text>.PP
</xsl:text>    <xsl:call-template name="bold">      <xsl:with-param name="node" select="publishername"/>      <xsl:with-param name="context" select="."/>    </xsl:call-template>    <!-- * Display e-mail address(es) and ulink(s) on same line as name -->    <xsl:apply-templates select=".//email|address/otheraddr/ulink" mode="authorsect"/>    <!-- * Display addresses on separate lines -->    <xsl:apply-templates select="address" mode="authorsect"/>    <!-- * Display localized "Publisher" literal -->    <xsl:call-template name="publisher.attribution"/>  </xsl:template>  <xsl:template name="publisher.attribution">    <xsl:text>
</xsl:text>    <xsl:text>.RS</xsl:text>     <xsl:if test="not($blurb-indent = '')">      <xsl:text> </xsl:text>      <xsl:value-of select="$blurb-indent"/>    </xsl:if>    <xsl:text>
</xsl:text>    <xsl:call-template name="gentext">      <xsl:with-param name="key" select="'Publisher'"/>    </xsl:call-template>    <xsl:text>.
</xsl:text>    <xsl:text>.RE
</xsl:text>   </xsl:template>  <xsl:template match="email|address/otheraddr/ulink" mode="authorsect">    <xsl:choose>      <xsl:when test="preceding-sibling::*[descendant-or-self::email]                      or preceding-sibling::address/otheraddr/ulink                      or ancestor::address[preceding-sibling::*[descendant-or-self::email]]                      or ancestor::address[preceding-sibling::address/otheraddr/ulink]">        <!-- * This is not the first instance, so do nothing. -->      </xsl:when>      <xsl:otherwise>        <!-- * This is first instances of an e-mail address or ulink, -->        <!-- * so put a space before it. -->        <xsl:text> </xsl:text>      </xsl:otherwise>    </xsl:choose>    <!-- * Note that the reason for the \& character after the opening -->    <!-- * angle bracket and before the closing angle bracket is to -->    <!-- * prevent groff from inserting a linebreak at those points and -->    <!-- * outputting a hyphen character where the break occurs -->    <xsl:text><\&</xsl:text>    <xsl:choose>      <xsl:when test="self::email">        <xsl:variable name="contents">          <xsl:apply-templates/>        </xsl:variable>        <xsl:value-of select="normalize-space($contents)"/>      </xsl:when>      <xsl:when test="self::ulink">        <xsl:variable name="contents">          <xsl:apply-templates select="."/>        </xsl:variable>        <xsl:value-of select="normalize-space($contents)"/>      </xsl:when>    </xsl:choose>    <xsl:text>\&></xsl:text>    <xsl:choose>      <xsl:when test="not(following-sibling::*[descendant-or-self::email]                      or following-sibling::address/otheraddr/ulink                      or ancestor::address[following-sibling::*[descendant-or-self::email]]                      or ancestor::address[following-sibling::address/otheraddr/ulink])">        <!-- * This is the final instance, so do nothing. -->      </xsl:when>      <xsl:otherwise>        <!-- * Separate multiple e-mail addresses or ulinks with a comma -->        <xsl:text>, </xsl:text>      </xsl:otherwise>    </xsl:choose>  </xsl:template>  <xsl:template match="affiliation" mode="authorsect">    <!-- * Get the string value of the contents of this Affiliation. If the -->    <!-- * affiliation only contains an Address child whose only content is -->    <!-- * an email address or ulink, then these contents will end up empty. -->    <xsl:variable name="contents">      <xsl:apply-templates mode="authorsect"/>    </xsl:variable>    <!-- * If contents are actually empty except for an email address -->    <!-- * or ulink, then output nothing. -->    <xsl:if test="$contents != ''">      <xsl:text>.br
</xsl:text>      <xsl:for-each select="shortaffil|jobtitle|orgname|orgdiv|address">        <!-- * only display output of nodes other than email or ulink -->        <xsl:apply-templates select="node()[not(self::email) and not(self::otheraddr/ulink)]"/>        <xsl:choose>          <xsl:when test="position() = last()"/> <!-- do nothing -->          <xsl:otherwise>            <!-- * only add comma if the node has a child node other than -->            <!-- * an email address or ulink -->            <xsl:if test="child::node()[not(self::email) and not(self::otheraddr/ulink)]">              <xsl:text>, </xsl:text>            </xsl:if>          </xsl:otherwise>        </xsl:choose>      </xsl:for-each>      <xsl:text>
</xsl:text>      <xsl:choose>        <xsl:when test="position() = last()"/> <!-- do nothing -->        <xsl:otherwise>          <!-- * put a line break after every Affiliation instance except -->          <!-- * the last one in the set -->          <xsl:text>.br
</xsl:text>        </xsl:otherwise>      </xsl:choose>    </xsl:if>  </xsl:template>  <xsl:template match="address" mode="authorsect">    <xsl:variable name="contents"                  select="normalize-space(node()[not(self::email)                          and not(self::otheraddr/ulink)])"/>    <!-- * If this contents of this Address do not contain anything except -->    <!-- * an email address or ulink, then output nothing. -->    <xsl:if test="$contents != ''">      <xsl:text>
</xsl:text>      <xsl:text>.br
</xsl:text>      <!--* Skip email and ulink descendants of Address (rendered elsewhere) -->      <xsl:apply-templates select="node()[not(self::email) and not(self::otheraddr/ulink)]"/>    </xsl:if>  </xsl:template>  <xsl:template name="attribution">    <xsl:param name="person-name"/>    <xsl:param name="refname" select="ancestor::refentry/refnamediv[1]/refname[1]"/>    <!-- * Determine appropriate attribution for a particular person's role. -->    <xsl:choose>      <!-- * if we have a *blurb or contrib, just use that -->      <xsl:when test="contrib|personblurb|authorblurb">        <xsl:apply-templates select="contrib|personblurb|authorblurb" mode="authorsect"/>        <xsl:text>
</xsl:text>      </xsl:when>      <xsl:otherwise>        <!-- * otherwise we have no attribution information to use... -->        <xsl:if test="not($person-name = '')">          <!-- * if we have a person name or organization name -->          <!-- * ($person-name can actually be an orgname, not just a -->          <!-- * person name), then report to the user that we are -->          <!-- * lacking attribution information for that person -->          <xsl:if test="$refentry.meta.get.quietly = 0">            <xsl:call-template name="log.message">              <xsl:with-param name="level">Warn</xsl:with-param>              <xsl:with-param name="source" select="$refname"/>              <xsl:with-param name="context-desc">AUTHOR sect.</xsl:with-param>              <xsl:with-param name="message">                <xsl:text>no personblurb|contrib for </xsl:text>                <xsl:value-of select="$person-name"/>              </xsl:with-param>            </xsl:call-template>            <xsl:call-template name="log.message">              <xsl:with-param name="level">Note</xsl:with-param>              <xsl:with-param name="source" select="$refname"/>              <xsl:with-param name="context-desc">AUTHOR sect.</xsl:with-param>              <xsl:with-param name="message">                <xsl:text>see see http://docbook.sf.net/el/contrib</xsl:text>              </xsl:with-param>            </xsl:call-template>            <xsl:call-template name="log.message">              <xsl:with-param name="level">Note</xsl:with-param>              <xsl:with-param name="source" select="$refname"/>              <xsl:with-param name="context-desc">AUTHOR sect.</xsl:with-param>              <xsl:with-param name="message">                <xsl:text>see see http://docbook.sf.net/el/personblurb</xsl:text>              </xsl:with-param>            </xsl:call-template>          </xsl:if>        </xsl:if>        <xsl:choose>          <!-- * If we have no *blurb or contrib, but this is an Author or -->          <!-- * Editor, then render the corresponding localized gentext -->          <xsl:when test="self::author">            <xsl:text>
</xsl:text>            <xsl:text>.RS</xsl:text>             <xsl:if test="not($blurb-indent = '')">              <xsl:text> </xsl:text>              <xsl:value-of select="$blurb-indent"/>            </xsl:if>            <xsl:text>
</xsl:text>            <xsl:call-template name="gentext">              <xsl:with-param name="key" select="'Author'"/>            </xsl:call-template>            <xsl:text>.
</xsl:text>            <xsl:text>.RE
</xsl:text>           </xsl:when>          <xsl:when test="self::editor">            <xsl:text>
</xsl:text>            <xsl:text>.RS</xsl:text>             <xsl:if test="not($blurb-indent = '')">              <xsl:text> </xsl:text>              <xsl:value-of select="$blurb-indent"/>            </xsl:if>            <xsl:text>
</xsl:text>            <xsl:call-template name="gentext">              <xsl:with-param name="key" select="'Editor'"/>            </xsl:call-template>            <xsl:text>.
</xsl:text>            <xsl:text>.RE
</xsl:text>           </xsl:when>          <!-- * If we have no *blurb or contrib, but this is an Othercredit, -->          <!-- * check value of Class attribute and use corresponding gentext. -->          <xsl:when test="self::othercredit">            <xsl:choose>              <xsl:when test="@class and @class != 'other'">                <xsl:text>
</xsl:text>                <xsl:text>.RS</xsl:text>                 <xsl:if test="not($blurb-indent = '')">                  <xsl:text> </xsl:text>                  <xsl:value-of select="$blurb-indent"/>                </xsl:if>                <xsl:text>
</xsl:text>                <xsl:call-template name="gentext">                  <xsl:with-param name="key" select="@class"/>                </xsl:call-template>                <xsl:text>.
</xsl:text>                <xsl:text>.RE
</xsl:text>               </xsl:when>              <xsl:otherwise>                <!-- * We have an Othercredit, but no usable value for the Class -->                <!-- * attribute, so nothing to show, do nothing -->              </xsl:otherwise>            </xsl:choose>          </xsl:when>          <xsl:otherwise>            <!-- * We have no *blurb or contrib or anything else we can use to -->            <!-- * display appropriate attribution for this person, so do nothing -->          </xsl:otherwise>        </xsl:choose>      </xsl:otherwise>    </xsl:choose>  </xsl:template>  <xsl:template match="personblurb|authorblurb" mode="authorsect">    <xsl:call-template name="mark.up.blurb.or.contrib"/>    <!-- * yeah, it's possible for a *blurb to have a "title" -->    <xsl:apply-templates select="title"/>    <xsl:apply-templates select="*[not(self::title)]"/>    <!-- * If this *blurb has a sibling "name" element of some kind, then -->    <!-- * the mark.up.blurb.or.contrib template will generated an "RS" -->    <!-- * call that will cause it to be indented; so we need to call -->    <!-- * "RE" to restore the previous indent level -->    <xsl:if test="../personname|../surname|../firstname      |../othername|../lineage|../honorific      |../affiliation|../email|../address">      <xsl:text>.RE
</xsl:text>     </xsl:if>  </xsl:template>  <xsl:template match="personblurb/title|authorblurb/title">    <!-- * always render period after title -->    <xsl:variable name="contents">      <xsl:apply-templates/>    </xsl:variable>    <xsl:value-of select="normalize-space($contents)"/>    <xsl:text>.</xsl:text>    <!-- * render space after Title+period if the title is followed -->    <!-- * by something element content -->    <xsl:if test="following-sibling::*[name() != '']">      <xsl:text> </xsl:text>    </xsl:if>  </xsl:template>  <xsl:template match="contrib" mode="authorsect">    <xsl:call-template name="mark.up.blurb.or.contrib"/>    <xsl:variable name="contents">      <xsl:apply-templates/>    </xsl:variable>    <xsl:value-of select="normalize-space($contents)"/>    <xsl:text>
</xsl:text>    <xsl:if test="../personname|../surname|../firstname      |../othername|../lineage|../honorific      |../affiliation|../email|../address">      <xsl:text>.RE
</xsl:text>     </xsl:if>  </xsl:template>  <xsl:template name="mark.up.blurb.or.contrib">    <xsl:choose>      <!-- * If this *blurb has a sibling "name" element of some kind, then -->      <!-- * we are already outputting the name content, and we need to -->      <!-- * indent the *blurb content after that. -->      <xsl:when          test="../personname|../surname|../firstname                |../othername|../lineage|../honorific                |../affiliation|../email|../address">        <xsl:text>
</xsl:text>        <xsl:text>.RS</xsl:text>         <xsl:if test="not($blurb-indent = '')">          <xsl:text> </xsl:text>          <xsl:value-of select="$blurb-indent"/>        </xsl:if>      </xsl:when>      <xsl:otherwise>        <!-- * otherwise, we have no "name" content, so don't indent; -->        <!-- * instead, decide if we need a .PP or just a .br -->        <xsl:choose>          <xsl:when test="not(preceding-sibling::*)">            <!-- * if this *blurb or contrib has no preceding -->            <!-- * siblings, then we need to start a new paragraph -->            <xsl:text>.PP</xsl:text>          </xsl:when>          <xsl:otherwise>            <!-- * otherwise, this has no preceding siblings, so -->            <!-- * just put a linebreak -->            <xsl:text>.br</xsl:text>          </xsl:otherwise>        </xsl:choose>      </xsl:otherwise>    </xsl:choose>    <xsl:text>
</xsl:text>  </xsl:template>  <!-- * ============================================================== -->  <!-- *     Assemble the COPYRIGHT section -->  <!-- * ============================================================== -->  <!-- * The COPYRIGHT section is output only if a copyright or -->  <!-- * legalnotice is found. It contains the copyright contents -->  <!-- * followed by the legalnotice contents. -->  <xsl:template name="copyright.section">    <xsl:param name="info"/>    <xsl:choose>      <xsl:when test="$info//copyright|$info//legalnotice">        <xsl:call-template name="make.subheading">          <xsl:with-param name="title">            <xsl:call-template name="gentext">              <xsl:with-param name="key">Copyright</xsl:with-param>            </xsl:call-template>          </xsl:with-param>        </xsl:call-template>        <xsl:text>.br
</xsl:text>        <!-- * the copyright mode="titlepage.mode" template is -->        <!-- * imported from the HTML stylesheets -->        <xsl:for-each select="          (($info[//copyright])[last()]//copyright)          | (($info[//legalnotice])[last()]//legalnotice)">          <xsl:choose>            <xsl:when test="local-name(.) = 'copyright'">              <xsl:variable name="contents">                <xsl:apply-templates select="." mode="titlepage.mode"/>              </xsl:variable>              <xsl:value-of select="normalize-space($contents)"/>              <xsl:text>
</xsl:text>              <xsl:text>.br
</xsl:text>            </xsl:when>            <xsl:otherwise>              <xsl:apply-templates select="." mode="titlepage.mode"/>              <xsl:text>
</xsl:text>              <xsl:text>.sp
</xsl:text>            </xsl:otherwise>          </xsl:choose>        </xsl:for-each>      </xsl:when>      <xsl:otherwise/> <!-- * do nothing, no copyright or legalnotice found -->    </xsl:choose>  </xsl:template>  <xsl:template match="legalnotice">    <xsl:apply-templates/>  </xsl:template>  <!-- * ============================================================== -->  <!-- * suppress refmeta and all *info (we grab what we need from them -->  <!-- * elsewhere) -->  <xsl:template match="refmeta"/>  <xsl:template match="info|refentryinfo|referenceinfo|refsynopsisdivinfo                       |refsectioninfo|refsect1info|refsect2info|refsect3info                       |setinfo|bookinfo|articleinfo|chapterinfo|sectioninfo                       |sect1info|sect2info|sect3info|sect4info|sect5info                       |partinfo|prefaceinfo|appendixinfo|docinfo"/>  <!-- ============================================================== -->  </xsl:stylesheet>
 |