diff --git a/harvest/oai.ini b/harvest/oai.ini index 7fc22feb9d6caef45b0ff5b3123db8588bea8b08..4cefe391cdbd4dc1ecaefdc042d2630999f16b8d 100644 --- a/harvest/oai.ini +++ b/harvest/oai.ini @@ -49,11 +49,12 @@ ; combined into a fewer number of files (this is determined by the OAI server's ; response chunk size). The default setting (false) will result in a new file being ; created for each record. Note that this function is primarily intended for -; harvesting MARC records; many of the example XSLT transformations for other +; harvesting MARC records; many of VuFind's example XSLT transformations for other ; types of metadata are designed to process one record at a time and will not -; work with this setting. However, it may be possible to revise the XSLT to handle -; batches of records, and such improvements would be welcomed as contributions to -; future releases of VuFind. +; work with this setting. However, it is possible to revise the XSLT to handle +; batches of records. Starting with VuFind 6.0, a demo .xsl for OJS that can handle +; combined records within a <collection> tag has been included as an example +; and can be found at $VUFIND_HOME/import/xsl/ojs-multirecord.xsl. ; ; combineRecordsTag may be used to supply a beginning and ending XML tag (if ; combinedRecords is set to true) which will be used to wrap the set of diff --git a/import/xsl/ojs-multirecord.xsl b/import/xsl/ojs-multirecord.xsl new file mode 100644 index 0000000000000000000000000000000000000000..b2816d28ce28d91e8c6255e2564d22c10b526366 --- /dev/null +++ b/import/xsl/ojs-multirecord.xsl @@ -0,0 +1,138 @@ +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:php="http://php.net/xsl" + xmlns:xlink="http://www.w3.org/2001/XMLSchema-instance"> + <xsl:output method="xml" indent="yes" encoding="utf-8"/> + <xsl:param name="institution">My University</xsl:param> + <xsl:param name="collection">OJS</xsl:param> + <xsl:template match="/"> + <xsl:if test="collection"> + <collection> + <xsl:for-each select="collection"> + <xsl:for-each select="oai_dc:dc"> + <xsl:apply-templates select="."/> + </xsl:for-each> + </xsl:for-each> + </collection> + </xsl:if> + <xsl:if test="oai_dc:dc"> + <xsl:apply-templates/> + </xsl:if> + </xsl:template> + <xsl:template match="oai_dc:dc"> + <add> + <doc> + <!-- ID --> + <!-- Important: This relies on an <identifier> tag being injected by the OAI-PMH harvester. --> + <field name="id"> + <xsl:value-of select="identifier"/> + </field> + + <!-- RECORDTYPE --> + <field name="recordtype">ojs</field> + + <!-- FULLRECORD --> + <!-- disabled for now; records are so large that they cause memory problems! + <field name="fullrecord"> + <xsl:copy-of select="php:function('VuFind::xmlAsText', //oai_dc:dc)"/> + </field> + --> + + <!-- ALLFIELDS --> + <field name="allfields"> + <xsl:value-of select="normalize-space(string(oai_dc:dc))"/> + </field> + + <!-- INSTITUTION --> + <field name="institution"> + <xsl:value-of select="$institution" /> + </field> + + <!-- COLLECTION --> + <field name="collection"> + <xsl:value-of select="$collection" /> + </field> + + <!-- LANGUAGE --> + <xsl:if test="dc:language"> + <xsl:for-each select="dc:language"> + <xsl:if test="string-length() > 0"> + <field name="language"> + <xsl:value-of select="php:function('VuFind::mapString', normalize-space(string(.)), 'language_map_iso639-1.properties')"/> + </field> + </xsl:if> + </xsl:for-each> + </xsl:if> + + <!-- FORMAT --> + <field name="format">Online</field> + + <!-- AUTHOR --> + <xsl:if test="dc:creator"> + <xsl:for-each select="dc:creator"> + <xsl:if test="normalize-space()"> + <field name="author"> + <xsl:value-of select="normalize-space()"/> + </field> + <!-- use first author value for sorting --> + <xsl:if test="position()=1"> + <field name="author_sort"> + <xsl:value-of select="normalize-space()"/> + </field> + </xsl:if> + </xsl:if> + </xsl:for-each> + </xsl:if> + + <!-- TITLE --> + <xsl:if test="dc:title[normalize-space()]"> + <field name="title"> + <xsl:value-of select="dc:title[normalize-space()]"/> + </field> + <field name="title_short"> + <xsl:value-of select="dc:title[normalize-space()]"/> + </field> + <field name="title_full"> + <xsl:value-of select="dc:title[normalize-space()]"/> + </field> + <field name="title_sort"> + <xsl:value-of select="php:function('VuFind::stripArticles', string(dc:title[normalize-space()]))"/> + </field> + </xsl:if> + + <!-- DESCRIPTION --> + <xsl:if test="dc:description"> + <field name="description"> + <xsl:value-of select="dc:description" /> + </field> + </xsl:if> + + <!-- PUBLISHER --> + <xsl:if test="dc:publisher[normalize-space()]"> + <field name="publisher"> + <xsl:value-of select="dc:publisher[normalize-space()]"/> + </field> + </xsl:if> + + <!-- PUBLISHDATE --> + <xsl:if test="dc:date"> + <field name="publishDate"> + <xsl:value-of select="substring(dc:date, 1, 4)"/> + </field> + <field name="publishDateSort"> + <xsl:value-of select="substring(dc:date, 1, 4)"/> + </field> + </xsl:if> + + <!-- URL --> + <xsl:if test="dc:identifier"> + <field name="url"> + <xsl:value-of select="dc:identifier[normalize-space()]"/> + </field> + </xsl:if> + </doc> + </add> + </xsl:template> +</xsl:stylesheet>