[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(.)), ' 	

,.:;' , '')"/> </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() < $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 <= 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 >= $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]