Next in thread → Next in month →

Re: [docbook-apps] Generating multiple metadata elements in user.head.content

From
Xmplar <>
Date
2013-08-29T11:48:13+00:00
ID
Thread
Re: [docbook-apps] Generating multiple metadata elements in user.head.content
Thanks Bob, that's a nice solution. Inexplicably, calling the "person.name.last-first" template didn't apply the
    punctuation between surname and firstname (there was a space but no
    comma). I substituted in your custom template instead:

    

    <xsl:apply-templates select="d:personname/d:surname"/>

                  <xsl:text>, </xsl:text>

                  <xsl:apply-templates
    select="d:personname/d:firstname"/>

    Dave

    

    On 29-08-13 3:12 AM, Bob Stayton wrote:
    
      
      
      
Hi Dave,

      
When processing an element that can appear
          zero or more times, I've found that creating a template that
          matches on that element and then using apply-templates works
          best. If there are no such elements, then the apply-templates
          does nothing.  If there are, it is applied as many times as
          there are elements.  Doing that in a
          new mode will prevent any interference from existing
          templates. 

      
 

      
This customization should do what you want.

      
 

      
 

      
<xsl:template name="user.head.content">

            <xsl:param name="node" select="."/>

            <xsl:param name="info" select="d:info[1]"/>

      
 

      
  <xsl:apply-templates 

              select="$info//d:authorgroup[@role='leadauthor']/d:author"

              mode="author.meta.mode"/>

          </xsl:template>

      
 

      
        

          <xsl:template match="d:author" mode="author.meta.mode">

                <meta name="dcterms:creator">

                    <xsl:attribute name="content">

                      <xsl:variable name="personname">

                        <xsl:choose>

                          <xsl:when test="d:personname/d:surname">

                            <xsl:call-template
          name="person.name.last-first"/>

                          </xsl:when>

                          <xsl:otherwise>

                            <xsl:call-template
          name="person.name"/>

                          </xsl:otherwise>

                        </xsl:choose>

                      </xsl:variable>

        

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

        

        
          </xsl:attribute>  

                </meta>

          </xsl:template>

        
 

        
</xsl:stylesheet>

        

        
I called a couple of utility templates from
          common/common.xsl to arrange the author information in a
          temporary variable named 'personname', and then took the value
          of the result to eliminate html span wrappers and reduce it to
          plain text for the attribute value.

        
 

      
      
Bob Stayton

          Sagehill Enterprises

          

      

        

        

        

          
From: Xmplar
          

          
Sent: Tuesday, August 27, 2013 6:48 PM

          
To: DocBook
              Apps 

          
Subject: [docbook-apps] Generating multiple
            metadata elements in user.head.content

        

      

      

      

      

        I have two book author names marked up in
        <authorgroup>:

      
<authorgroup role="leadauthor">

                                             
          <author>

                                             
                      <personname><honorific>Mr</honorific><firstname>John</firstname><surname>Smith</surname></personname>

                                                         
          <contrib>Lead author
          contribution</contrib>

                                                         
          <affiliation>

                                                                     
          <shortaffil>Short affil.</shortaffil>

                                                                     
          <jobtitle>Job title</jobtitle>

                                                                     
          <orgname>Organisational
          affiliation</orgname>

                                                                     
          <orgdiv>Org div</orgdiv>

                                                                     
          <address>Org address</address>

                                                         
          </affiliation>

                                             
          </author>

                                             
          <author>

                                                         
          <personname>Name of second
          lead author</personname>

                                             
          </author>

                                  </authorgroup>

      
 

      
My first issue is trying to generate both
        <author> names in separate meta elements in HTML5 using
        1.78.1-ns. This is all I get:

      
<meta name="dcterms:creator" content="Smith, John" />

      
I have a customization that generates only
        the first author’s names (firstname and surname) – I don’t get
        the second author, nor do I get any content inside only
        <personname> (so far I need both <firstname> and
        <surname> to generate content):

      
<xsl:template name="user.head.content">

              <xsl:param name="node" select="."/>

              <xsl:variable name="info" select="(d:info)[1]"/>

      
…

      
<xsl:if test="$info and
          $info//d:author[ancestor::d:authorgroup[@role='leadauthor']]">      

                <meta name="dcterms:creator">

                    <xsl:attribute name="content">

                      <!--<xsl:call-template
          name="person.name.last-first">

                    <xsl:with-param
          name="node" select="."/>

                  </xsl:call-template>-->

                        

                      <xsl:choose>

                        <xsl:when test="descendant::d:surname">

                          <xsl:value-of select="normalize-space(string($info/d:authorgroup[@role='leadauthor']/d:author/d:personname/d:surname))"/>

                          <xsl:text>, </xsl:text>

                          <xsl:value-of select="normalize-space(string($info/d:authorgroup[@role='leadauthor']/d:author/d:personname/d:firstname))"/>

                        </xsl:when>

                        <xsl:otherwise>

                          <xsl:value-of select="normalize-space(string($info/d:authorgroup[@role='leadauthor']/d:author/d:personname))"/>    

                        </xsl:otherwise>

                      </xsl:choose>

                    </xsl:attribute>  

                </meta>

                

              </xsl:if>

      
…

      
</xsl:template>

      
 

      
I tried using xsl:for-each around the
        <meta> coding, and then again inside <meta>, but
        that generates the first author’s name multiple times in one
        <meta> element. I can’t see any clues from the EPUB
        metadata stylesheets either.

      
So: (1) How do I generate one meta element
        *for each author*, and (2) What coding works to generate content
        marked up in <personname> only (i.e. no child elements)?

      
      
      
      
      
      
      
      
-- 

        Dave Gardiner
Next in thread → Next in month →