Bug 11786: Improve RDFa structured data schema.org mappings

This patch updates both the prog and bootstrap themes to provide better
schema.org mappings for catalogue elements in the following ways:

* More granular author attributes (one "author" property per author in records
  with multiple contributors; wrap in a Person or Organization type instead of
  using a simple literal value)
* Use "byArtist" instead of "author" for music recordings to respect schema.org
  preferences
* Use alternateName instead of alternativeHeadline, as the former is a better
  parallel to the "name" property

Signed-off-by: Dan Scott <dan@coffeecode.net>
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
Only covers MARC21, but that is no reason not to move it forward

Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Passes all tests. Looked at the source code of a few records in both
prog and bootstrap and took a look at the properties using
http://www.google.com/webmasters/tools/richsnippets.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
This commit is contained in:
Dan Scott 2014-02-18 13:29:35 -05:00 committed by Galen Charlton
parent 7378d48841
commit 3bc1021deb
2 changed files with 58 additions and 12 deletions

View file

@ -112,7 +112,7 @@
<!-- Title Statement -->
<!-- Alternate Graphic Representation (MARC 880) -->
<xsl:if test="$display880">
<h1 class="title" property="alternativeHeadline">
<h1 class="title" property="alternateName">
<xsl:call-template name="m880Select">
<xsl:with-param name="basetags">245</xsl:with-param>
<xsl:with-param name="codes">abhfgknps</xsl:with-param>
@ -159,10 +159,11 @@
</xsl:if>
<xsl:choose>
<xsl:when test="marc:datafield[@tag=100] or marc:datafield[@tag=110] or marc:datafield[@tag=111] or marc:datafield[@tag=700] or marc:datafield[@tag=710] or marc:datafield[@tag=711]">
<h5 class="author" property="author">by
<h5 class="author">by
<xsl:call-template name="showAuthor">
<xsl:with-param name="authorfield" select="marc:datafield[@tag=100 or @tag=110 or @tag=111 or @tag=700 or @tag=710 or @tag=711]"/>
<xsl:with-param name="UseAuthoritiesForTracings" select="$UseAuthoritiesForTracings"/>
<xsl:with-param name="materialTypeLabel" select="$materialTypeLabel"/>
</xsl:call-template>
</h5>
</xsl:when>
@ -473,7 +474,7 @@
<xsl:if test="marc:datafield[@tag=246]">
<span class="results_summary other_title"><span class="label">Other title: </span>
<xsl:for-each select="marc:datafield[@tag=246]">
<span property="alternativeHeadline">
<span property="alternateName">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
@ -491,7 +492,7 @@
<xsl:if test="marc:datafield[@tag=242]">
<span class="results_summary translated_title"><span class="label">Title translated: </span>
<xsl:for-each select="marc:datafield[@tag=242]">
<span property="alternativeHeadline">
<span property="alternateName">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
@ -507,7 +508,7 @@
<!-- Uniform Title Statement: Alternate Graphic Representation (MARC 880) -->
<xsl:if test="$display880">
<span property="alternativeHeadline">
<span property="alternateName">
<xsl:call-template name="m880Select">
<xsl:with-param name="basetags">130,240</xsl:with-param>
<xsl:with-param name="codes">adfklmor</xsl:with-param>
@ -520,7 +521,7 @@
<xsl:if test="marc:datafield[@tag=130]|marc:datafield[@tag=240]|marc:datafield[@tag=730][@ind2!=2]">
<span class="results_summary uniform_titles"><span class="label">Uniform titles: </span>
<xsl:for-each select="marc:datafield[@tag=130]|marc:datafield[@tag=240]|marc:datafield[@tag=730][@ind2!=2]">
<span property="alternativeHeadline">
<span property="alternateName">
<xsl:variable name="str">
<xsl:for-each select="marc:subfield">
<xsl:if test="(contains('adfklmor',@code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
@ -987,6 +988,7 @@
<xsl:template name="showAuthor">
<xsl:param name="authorfield" />
<xsl:param name="UseAuthoritiesForTracings" />
<xsl:param name="materialTypeLabel" />
<xsl:for-each select="$authorfield">
<xsl:choose><xsl:when test="position()!=1"><xsl:text>; </xsl:text></xsl:when></xsl:choose>
<xsl:choose>
@ -1008,11 +1010,32 @@
<xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=au:"<xsl:value-of select="marc:subfield[@code='a']"/>"</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<span resource="#record"><span>
<xsl:choose>
<xsl:when test="substring(@tag, 1, 1)='1'">
<xsl:choose>
<xsl:when test="$materialTypeLabel='Music'"><xsl:attribute name="property">byArtist</xsl:attribute></xsl:when>
<xsl:otherwise><xsl:attribute name="property">author</xsl:attribute></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise><xsl:attribute name="property">contributor</xsl:attribute></xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@tag, 2, 1)='0'">
<xsl:choose>
<xsl:when test="$materialTypeLabel='Music'"><xsl:attribute name="typeof">MusicGroup</xsl:attribute></xsl:when>
<xsl:otherwise><xsl:attribute name="typeof">Person</xsl:attribute></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise><xsl:attribute name="typeof">Organization</xsl:attribute></xsl:otherwise>
</xsl:choose>
<span property="name">
<xsl:choose>
<xsl:when test="@tag=100 or @tag=700"><xsl:call-template name="nameABCQ"/></xsl:when>
<xsl:when test="@tag=110 or @tag=710"><xsl:call-template name="nameABCDN"/></xsl:when>
<xsl:when test="@tag=111 or @tag=711"><xsl:call-template name="nameACDEQ"/></xsl:when>
</xsl:choose>
</span></span></span>
<!-- add relator code too between brackets-->
<xsl:if test="marc:subfield[@code='4' or @code='e']">
<span class="relatorcode">

View file

@ -112,7 +112,7 @@
<!-- Title Statement -->
<!-- Alternate Graphic Representation (MARC 880) -->
<xsl:if test="$display880">
<h1 class="title" property="alternativeHeadline">
<h1 class="title" property="alternateName">
<xsl:call-template name="m880Select">
<xsl:with-param name="basetags">245</xsl:with-param>
<xsl:with-param name="codes">abhfgknps</xsl:with-param>
@ -159,10 +159,11 @@
</xsl:if>
<xsl:choose>
<xsl:when test="marc:datafield[@tag=100] or marc:datafield[@tag=110] or marc:datafield[@tag=111] or marc:datafield[@tag=700] or marc:datafield[@tag=710] or marc:datafield[@tag=711]">
<h5 class="author" property="author">by
<h5 class="author">by
<xsl:call-template name="showAuthor">
<xsl:with-param name="authorfield" select="marc:datafield[@tag=100 or @tag=110 or @tag=111 or @tag=700 or @tag=710 or @tag=711]"/>
<xsl:with-param name="UseAuthoritiesForTracings" select="$UseAuthoritiesForTracings"/>
<xsl:with-param name="materialTypeLabel" select="$materialTypeLabel"/>
</xsl:call-template>
</h5>
</xsl:when>
@ -473,7 +474,7 @@
<xsl:if test="marc:datafield[@tag=246]">
<span class="results_summary other_title"><span class="label">Other title: </span>
<xsl:for-each select="marc:datafield[@tag=246]">
<span property="alternativeHeadline">
<span property="alternateName">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
@ -491,7 +492,7 @@
<xsl:if test="marc:datafield[@tag=242]">
<span class="results_summary translated_title"><span class="label">Title translated: </span>
<xsl:for-each select="marc:datafield[@tag=242]">
<span property="alternativeHeadline">
<span property="alternateName">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
@ -507,7 +508,7 @@
<!-- Uniform Title Statement: Alternate Graphic Representation (MARC 880) -->
<xsl:if test="$display880">
<span property="alternativeHeadline">
<span property="alternateName">
<xsl:call-template name="m880Select">
<xsl:with-param name="basetags">130,240</xsl:with-param>
<xsl:with-param name="codes">adfklmor</xsl:with-param>
@ -520,7 +521,7 @@
<xsl:if test="marc:datafield[@tag=130]|marc:datafield[@tag=240]|marc:datafield[@tag=730][@ind2!=2]">
<span class="results_summary uniform_titles"><span class="label">Uniform titles: </span>
<xsl:for-each select="marc:datafield[@tag=130]|marc:datafield[@tag=240]|marc:datafield[@tag=730][@ind2!=2]">
<span property="alternativeHeadline">
<span property="alternateName">
<xsl:variable name="str">
<xsl:for-each select="marc:subfield">
<xsl:if test="(contains('adfklmor',@code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
@ -987,6 +988,7 @@
<xsl:template name="showAuthor">
<xsl:param name="authorfield" />
<xsl:param name="UseAuthoritiesForTracings" />
<xsl:param name="materialTypeLabel" />
<xsl:for-each select="$authorfield">
<xsl:choose><xsl:when test="position()!=1"><xsl:text>; </xsl:text></xsl:when></xsl:choose>
<xsl:choose>
@ -1008,11 +1010,32 @@
<xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=au:"<xsl:value-of select="marc:subfield[@code='a']"/>"</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<span resource="#record"><span>
<xsl:choose>
<xsl:when test="substring(@tag, 1, 1)='1'">
<xsl:choose>
<xsl:when test="$materialTypeLabel='Music'"><xsl:attribute name="property">byArtist</xsl:attribute></xsl:when>
<xsl:otherwise><xsl:attribute name="property">author</xsl:attribute></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise><xsl:attribute name="property">contributor</xsl:attribute></xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@tag, 2, 1)='0'">
<xsl:choose>
<xsl:when test="$materialTypeLabel='Music'"><xsl:attribute name="typeof">MusicGroup</xsl:attribute></xsl:when>
<xsl:otherwise><xsl:attribute name="typeof">Person</xsl:attribute></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise><xsl:attribute name="typeof">Organization</xsl:attribute></xsl:otherwise>
</xsl:choose>
<span property="name">
<xsl:choose>
<xsl:when test="@tag=100 or @tag=700"><xsl:call-template name="nameABCQ"/></xsl:when>
<xsl:when test="@tag=110 or @tag=710"><xsl:call-template name="nameABCDN"/></xsl:when>
<xsl:when test="@tag=111 or @tag=711"><xsl:call-template name="nameACDEQ"/></xsl:when>
</xsl:choose>
</span></span></span>
<!-- add relator code too between brackets-->
<xsl:if test="marc:subfield[@code='4' or @code='e']">
<span class="relatorcode">