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