OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

docbook-apps message

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


Subject: Fwd: [docbook-apps] multiple authors



Begin forwarded message:

> From: Doug du Boulay <ddb@owari.msl.titech.ac.jp>
> Date: September 2, 2005 6:31:50 AM EDT
> To: Tristan Fiedler <fiedler@cshl.edu>
> Subject: Re: [docbook-apps] multiple authors
>
> On Thursday 11 August 2005 06:01, Tristan Fiedler wrote:
>> I am creating a docbook <article>, and have multiple authors with the
>> same affiliation.  I don't want the affiliation listed for each 
>> author,
>> since the affiliation is the same.
>>
>> Does anyone have a valid docbook solution?
>>
>> ---- My current XML :
>>   <author>
>>    <firstname>john</firstname>
>>    <surname>doe</surname>
>>    <affiliation>
>>     <orgname>Department of Biology, New York University</orgname>
>>     <address>New York, NY 10003 USA</address>
>>    </affiliation>
>>   </author>
>
> Hi Tristan,
>
> I've just managed to get an XSLT customization to do the above for 
> HTML.
> It presents as:
>
>        John Doe,[a] Jane Doe[a] and Joe Bloggs[b]
>
>  [a]Department of Biology, New York University New York, NY 10003 USA; 
> [b]...
>
> Admittedly I haven't tested it very extensively, but you might like to
> experiment if you haven't sorted it out yet yourself.
>
> hope its useful
>
> Cheers
> Doug
>

XSL file below :
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
xmlns:exsl="http://exslt.org/common"; version="1.0" 
exclude-result-prefixes="exsl">


<!-- =============================================================== -->


<xsl:template match="authorblurb|personblurb" mode="titlepage.mode">
   <div class="{name(.)}">
     <xsl:apply-templates mode="titlepage.mode"/>
   </div>
</xsl:template>

<xsl:template match="author" mode="article.titlepage.recto.mode">
   <span class="{name(.)}"><xsl:call-template name="person.name"/></span>
</xsl:template>

<xsl:template match="affiliation" mode="article.titlepage.recto.mode">
   <span class="address"><xsl:apply-templates select="./*" 
mode="titlepage.mode"/></span>
</xsl:template>

<xsl:template match="address" mode="titlepage.mode">
   <xsl:apply-templates select="./*" mode="titlepage.mode"/>
</xsl:template>
<!--
           <xsl:apply-templates select=".//affiliation" 
mode="article.titlepage.recto.mode"/>
   -->

<xsl:template match="*" mode="create.author.address.key">
   <xsl:value-of select="translate(normalize-space(string(.)),
                                  '&#x20;&#x9;&#xA;&#xD;,.:;' ,  '')"/>
</xsl:template>


<xsl:template match="authorgroup" mode="article.titlepage.recto.mode">

   <xsl:variable name="alist" select="author[not(@role='contact')]" />
   <xsl:variable name="acount" select="count($alist)" />
      <!--  make a full length space delimited list of stripped down 
addresses -->
   <xsl:variable name="fulladdresskeylist">
     <xsl:for-each select="$alist//affiliation">
       <xsl:text> </xsl:text>
       <xsl:apply-templates select="*[not(shortaffil) and not(jobtitle)]"
                 mode="create.author.address.key"/>
     </xsl:for-each>
     <xsl:text> </xsl:text>
   </xsl:variable>

     <xsl:message>
       <xsl:value-of select="$fulladdresskeylist"/>
     </xsl:message>

      <!--  make a space delimited list of unique addresses, in order of 
appearance -->
   <xsl:variable name="addresskeylist">
     <xsl:call-template name="reduce.address.key.list">
       <xsl:with-param name="list" select="$fulladdresskeylist"/>
     </xsl:call-template>
   </xsl:variable>

     <xsl:message>
       <xsl:value-of select="$addresskeylist"/>
     </xsl:message>
<!--
   -->
   <div class="{name(.)}">
     <div class="authors">
       <xsl:for-each select="$alist[position() &lt; $acount - 1 ]">
         <xsl:apply-templates select="." 
mode="article.titlepage.recto.mode"/>
         <xsl:text>,</xsl:text>
         <xsl:call-template name="format.address.sequence.number">
           <xsl:with-param name="seqnum" >
             <xsl:call-template name="unique.author.address.sequence">
               <xsl:with-param name="author" select="."/>
               <xsl:with-param name="addresskeylist" 
select="$addresskeylist"/>
             </xsl:call-template>
           </xsl:with-param>
           <xsl:with-param name="role"   select="'xref'"/>
         </xsl:call-template>
         <xsl:text> </xsl:text>
       </xsl:for-each>

       <xsl:for-each select="$alist[position() = $acount - 1 ]">
         <xsl:apply-templates select="." 
mode="article.titlepage.recto.mode"/>
         <xsl:call-template name="format.address.sequence.number">
           <xsl:with-param name="seqnum" >
             <xsl:call-template name="unique.author.address.sequence">
               <xsl:with-param name="author" select="."/>
               <xsl:with-param name="addresskeylist" 
select="$addresskeylist"/>
             </xsl:call-template>
           </xsl:with-param>
           <xsl:with-param name="role"   select="'xref'"/>
         </xsl:call-template>
         <xsl:text> and </xsl:text>
       </xsl:for-each>

       <xsl:for-each select="$alist[position() = $acount ]">
         <xsl:apply-templates select="." 
mode="article.titlepage.recto.mode"/>
         <xsl:call-template name="format.address.sequence.number">
           <xsl:with-param name="seqnum" >
             <xsl:call-template name="unique.author.address.sequence">
               <xsl:with-param name="author" select="."/>
               <xsl:with-param name="addresskeylist" 
select="$addresskeylist"/>
             </xsl:call-template>
           </xsl:with-param>
           <xsl:with-param name="role"   select="'xref'"/>
         </xsl:call-template>
       </xsl:for-each>
       </div>

     <div class="addresses">
       <xsl:for-each select="$alist">
         <xsl:variable name="address.seq.num">
           <xsl:call-template name="author.sequence.to.address.seq">
             <xsl:with-param name="authorseq" select="position()"/>
             <xsl:with-param name="full.address.list" 
select="$fulladdresskeylist"/>
             <xsl:with-param name="short.address.list" 
select="$addresskeylist"/>
           </xsl:call-template>
         </xsl:variable>
         <xsl:if test="$address.seq.num != 0">
           <xsl:if test="$address.seq.num != 1">
             <xsl:text>; </xsl:text>
           </xsl:if>
           <xsl:call-template name="format.address.sequence.number">
             <xsl:with-param name="seqnum" select="$address.seq.num"/>
             <xsl:with-param name="role"   select="'target'"/>
           </xsl:call-template>
           <xsl:apply-templates select=".//affiliation" 
mode="article.titlepage.recto.mode"/>
         </xsl:if>
       </xsl:for-each>
     </div>

     <div class="contact">
       <xsl:text>Correspondence e-mail: </xsl:text>
       <xsl:apply-templates select="author[(@role='contact')][1]//email"
                              mode="titlepage.mode" />
     </div>
   </div>
</xsl:template>




<xsl:template name="reduce.address.key.list">
   <xsl:param name="list" />
   <xsl:param name="ptr" select="1" />

   <xsl:variable name="key"  
select="substring-before(substring($list,$ptr+1),' ')" />

   <xsl:if  test="string-length(substring-before($list,$key)) = $ptr" >
              <!-- first occurence in source string -->
     <xsl:text> </xsl:text>
     <xsl:value-of select="$key"/>  <!-- copy to destination string -->
   </xsl:if>

   <xsl:variable name="keylen" select="string-length($key)"/>
     <xsl:message>
       <xsl:text>reduce: </xsl:text>
       <xsl:value-of select="string-length($list)"/>
       <xsl:text>: </xsl:text>
       <xsl:value-of select="$ptr"/>
       <xsl:text>: </xsl:text>
       <xsl:value-of select="$keylen"/>
       <xsl:text>::</xsl:text>
       <xsl:value-of select="$key"/>
       <xsl:text>::</xsl:text>
     </xsl:message>

   <xsl:if test="$ptr+ $keylen + 1 &lt;= string-length($list)">
     <xsl:call-template name="reduce.address.key.list">
       <xsl:with-param name="list" select="$list" />
       <xsl:with-param name="ptr" select="$ptr+$keylen+1" />
     </xsl:call-template>
   </xsl:if>

</xsl:template>


<xsl:template name="author.sequence.to.address.seq">
   <xsl:param name="full.address.list" />
   <xsl:param name="short.address.list" />
   <xsl:param name="authorseq" /> <!-- sequence in the authorgroup node 
set -->
                                  <!-- if not the first instance, then 
return 0 -->

   <xsl:variable name="seq.ptr">
     <xsl:call-template name="get.nth.address.seq.ptr">
       <xsl:with-param name="list" select="$full.address.list"/>
       <xsl:with-param name="authorseq" select="$authorseq"/>
     </xsl:call-template>
   </xsl:variable>

   <xsl:variable name="seq.key"
               
select="substring-before(substring($full.address.list,$seq.ptr+1),' ')" 
/>

     <xsl:message>
       <xsl:text>authorseq: </xsl:text>
       <xsl:value-of select="$authorseq"/>
       <xsl:text>: </xsl:text>
       <xsl:value-of select="$seq.ptr"/>
       <xsl:text>::</xsl:text>
       <xsl:value-of select="$seq.key"/>
       <xsl:text>::</xsl:text>
     </xsl:message>

   <xsl:choose>
     <xsl:when 
test="contains(substring($full.address.list,1,$seq.ptr),$seq.key)">
       <xsl:value-of select="0"/>    <!-- ignore if a previous occurence 
-->
     </xsl:when>
     <xsl:otherwise>             <!-- get sequence number from the 
shortlist -->
       <xsl:call-template name="unique.author.address.sequence.number">
         <xsl:with-param name="counter" select="1"/>
         <xsl:with-param name="string"
                   
select="substring-before($short.address.list,$seq.key)"/>
       </xsl:call-template>
     </xsl:otherwise>
   </xsl:choose>

</xsl:template>

<xsl:template name="get.nth.address.seq.ptr">
   <xsl:param name="list" />
   <xsl:param name="authorseq" /> <!-- sequence in the authorgroup node 
set -->
   <xsl:param name="ptr" select="1" />
   <xsl:param name="count" select="0" />

   <xsl:variable name="key"  
select="substring-before(substring($list,$ptr+1),' ')" />
   <xsl:variable name="keylen" select="string-length($key)"/>

     <xsl:message>
       <xsl:value-of select="$count"/>
       <xsl:text>: </xsl:text>
       <xsl:value-of select="$authorseq"/>
       <xsl:text>: </xsl:text>
       <xsl:value-of select="$ptr"/>
       <xsl:text>: </xsl:text>
       <xsl:value-of select="$keylen"/>
       <xsl:text>: </xsl:text>
       <xsl:value-of select="$key"/>
     </xsl:message>

   <xsl:choose>
     <xsl:when test="$count+ 1 &gt;= $authorseq" >
       <xsl:value-of select="$ptr"/>    <!-- pointer to start of string 
pos result -->
     </xsl:when>
     <xsl:otherwise>
       <xsl:call-template name="get.nth.address.seq.ptr">
         <xsl:with-param name="list" select="$list" />
         <xsl:with-param name="authorseq" select="$authorseq" />
         <xsl:with-param name="ptr" select="$ptr+$keylen+1" />
         <xsl:with-param name="count" select="$count+1" />
       </xsl:call-template>
     </xsl:otherwise>
   </xsl:choose>
</xsl:template>


<xsl:template name="unique.author.address.sequence">
   <xsl:param name="author" />
   <xsl:param name="addresskeylist"/>

   <xsl:variable name="author-add-key">
     <xsl:apply-templates select="$author//address"  
mode="create.author.address.key"/>
   </xsl:variable>

   <xsl:call-template name="unique.author.address.sequence.number">
     <xsl:with-param name="counter" select="1"/>
     <xsl:with-param name="string"
                   
select="substring-before($addresskeylist,$author-add-key)"/>
   </xsl:call-template>
</xsl:template>




<xsl:template name="unique.author.address.sequence.number">
   <xsl:param name="counter" />
   <xsl:param name="string" />
   <xsl:variable name="trailing" select="substring-after($string,' ')"/>
   <xsl:choose>
     <xsl:when test="$trailing = ''">
       <xsl:value-of select="$counter"/>  <!-- num of preceding spaces = 
sequ. number -->
     </xsl:when>
     <xsl:otherwise>
        <xsl:call-template name="unique.author.address.sequence.number">
          <xsl:with-param name="string" select="$trailing"/>
          <xsl:with-param name="counter" select="$counter + 1"/>
        </xsl:call-template>
     </xsl:otherwise>
   </xsl:choose>
</xsl:template>


<xsl:template name="format.address.sequence.number">
   <xsl:param name="seqnum" select="0"/>
   <xsl:param name="role" select="xref" />
   <xsl:choose>
     <xsl:when test="$role = 'xref'">
       <sup>
         <xsl:text>[</xsl:text>
         <a href="#au-ad-{$seqnum}">
           <xsl:number value="$seqnum" format="a"/>
         </a>
         <xsl:text>]</xsl:text>
       </sup>
     </xsl:when>
     <xsl:otherwise>
       <sup>
         <xsl:text>[</xsl:text>
         <a name="au-ad-{$seqnum}">
           <xsl:number value="$seqnum" format="a"/>
         </a>
         <xsl:text>]</xsl:text>
       </sup>
     </xsl:otherwise>
   </xsl:choose>
</xsl:template>


</xsl:stylesheet>



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