<?xml version="1.0" encoding="utf-8"?>
|
|
<xsl:stylesheet version="1.0"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
xmlns:srw="http://www.loc.gov/zing/srw/"
|
|
xmlns:diag="http://www.loc.gov/zing/srw/diagnostic/"
|
|
xmlns:srw_mods="info:srw/schema/1/mods-v3.2"
|
|
xmlns:mods="http://www.loc.gov/mods/v3"
|
|
xmlns:zr="http://explain.z3950.org/dtd/2.0/"
|
|
exclude-result-prefixes="srw_mods mods srw" >
|
|
<xsl:output method="html" indent="yes"/>
|
|
<!--
|
|
converts MODS v3.2 records (which are wrapped in SRW XML) to HTML
|
|
modified after <http://www.loc.gov/standards/mods/mods.xsl> by Matthias Steffens <mailto:refbase@extracts.de>
|
|
-->
|
|
|
|
<!--
|
|
TODO: - include previous/next navigation links (this will require the SRU query to be present in the SRU searchRetrieve response as extraResponseData!)
|
|
- see inline comments labeled wit "TODO"
|
|
-->
|
|
<xsl:variable name="dictionary" select="document('locales/en/modsDictionary.xml')/dictionary"/>
|
|
<xsl:variable name="explainResponse" select="document('sru.php')/srw:explainResponse/srw:record/srw:recordData/zr:explain"/>
|
|
<xsl:variable name="officialDatabaseName" select="$explainResponse/zr:databaseInfo/zr:title"/>
|
|
<xsl:variable name="hostInstitutionName" select="$explainResponse/zr:databaseInfo/zr:author"/>
|
|
<xsl:variable name="databaseBaseURL" select="$explainResponse/zr:databaseInfo/zr:links/zr:link[@type='www']"/>
|
|
<xsl:variable name="logoURL" select="$explainResponse/zr:databaseInfo/zr:links/zr:link[@type='icon']"/>
|
|
<xsl:variable name="defaultNumberOfRecords" select="$explainResponse/zr:configInfo/zr:default[@type='numberOfRecords']"/>
|
|
|
|
<xsl:variable name="totalNumberOfRecords" select="srw:searchRetrieveResponse/srw:numberOfRecords"/>
|
|
|
|
<!--
|
|
TODO: uncomment when including previous/next navigation links
|
|
|
|
<xsl:variable name="startRecord" select="srw:searchRetrieveResponse/srw:records/srw:record[1]/srw:recordPosition"/>
|
|
<xsl:variable name="nextStartRecord" select="srw:searchRetrieveResponse/srw:nextRecordPosition"/>
|
|
|
|
<xsl:variable name="previousStartRecord">
|
|
<xsl:choose>
|
|
<xsl:when test="$startRecord = $totalNumberOfRecords">
|
|
<xsl:value-of select="$totalNumberOfRecords - $defaultNumberOfRecords"/>
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
<xsl:if test="$startRecord > 0">
|
|
<xsl:value-of select="$startRecord - ( $nextStartRecord - $startRecord )"/>
|
|
</xsl:if>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:variable>
|
|
-->
|
|
|
|
<xsl:template match="srw:searchRetrieveResponse">
|
|
|
|
<html>
|
|
<head>
|
|
<title><xsl:value-of select="$officialDatabaseName"/> -- Query Results</title>
|
|
<meta http-equiv="Content-Style-Type" content="text/css"/>
|
|
<link rel="stylesheet" href="css/style.css" type="text/css" title="CSS Definition"/>
|
|
<style type="text/css">
|
|
DIV {vertical-align:top;font-size:1em}
|
|
.label {vertical-align:top}
|
|
.data {vertical-align:top}
|
|
.level2 {margin-left:1em}
|
|
.level3 {margin-left:2em}
|
|
.level4 {margin-left:3em}
|
|
.level5 {margin-left:4em}
|
|
.level6 {margin-left:5em}
|
|
</style>
|
|
</head>
|
|
<body bgcolor="#FFFFFF">
|
|
<!-- page header: -->
|
|
<table class="pageheader" align="center" border="0" cellpadding="0" cellspacing="10" width="95%" summary="This holds the title logo and info">
|
|
<tr>
|
|
<td valign="bottom" rowspan="2" align="left" width="120">
|
|
<a>
|
|
<xsl:attribute name="href">
|
|
<!-- note that the logo should point to the URL given in '$hostInstitutionURL' but this information is currently not available in the SRU explain response -->
|
|
<xsl:value-of select="$databaseBaseURL"/>
|
|
</xsl:attribute>
|
|
<img src="{$logoURL}" alt="Home" border="0" />
|
|
</a>
|
|
</td>
|
|
<td>
|
|
<h2><xsl:value-of select="$officialDatabaseName"/></h2>
|
|
<span class="smallup">
|
|
<a href="index.php" title="go to main page">Home</a><xsl:text> | </xsl:text>
|
|
<a href="show.php?records=all" title="show all records in the database">Show All</a><xsl:text> | </xsl:text>
|
|
<a href="simple_search.php" title="search the main fields of the database">Simple Search</a><xsl:text> | </xsl:text>
|
|
<a href="advanced_search.php" title="search all fields of the database">Advanced Search</a>
|
|
</span>
|
|
</td>
|
|
<td class="small" align="right" valign="middle"><br /></td>
|
|
</tr>
|
|
<tr>
|
|
<xsl:choose>
|
|
<!-- diagnostics: -->
|
|
<xsl:when test="srw:diagnostics">
|
|
<td><xsl:text>Your query caused the following error:</xsl:text></td>
|
|
</xsl:when>
|
|
<!-- search results: -->
|
|
<xsl:otherwise>
|
|
<td><xsl:value-of select="srw:records/srw:record[1]/srw:recordPosition"/>-<xsl:value-of select="srw:records/srw:record[position()=last()]/srw:recordPosition"/> of <xsl:value-of select="$totalNumberOfRecords"/> records found:</td>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
<td class="small" align="right" valign="middle"><a href="user_login.php" title="login to the database">Login</a></td>
|
|
</tr>
|
|
</table>
|
|
<hr class="pageheader" align="center" width="95%" />
|
|
<xsl:choose>
|
|
<!-- diagnostics: -->
|
|
<xsl:when test="srw:diagnostics">
|
|
<xsl:apply-templates select="srw:diagnostics"/>
|
|
</xsl:when>
|
|
<!-- search results: -->
|
|
<xsl:otherwise>
|
|
<xsl:apply-templates select="srw:records"/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
<!-- page footer: -->
|
|
<hr class="pagefooter" align="center" width="95%" />
|
|
<table class="pagefooter" align="center" border="0" cellpadding="0" cellspacing="10" width="95%" summary="This table holds the footer">
|
|
<tr>
|
|
<td class="small" width="105"><a href="index.php" title="go to main page">Home</a></td>
|
|
<td class="small" align="center">
|
|
<a href="sru.php" title="search the SRU web service">SRU Search</a><xsl:text> | </xsl:text>
|
|
<a href="library_search.php">
|
|
<xsl:attribute name="title">
|
|
<xsl:text>search the library of the </xsl:text><xsl:value-of select="$hostInstitutionName"/>
|
|
</xsl:attribute>
|
|
<xsl:text>Library Search</xsl:text>
|
|
</a><xsl:text> | </xsl:text>
|
|
<a href="show.php" title="display details for a particular record by entering its database serial number">Show Record</a><xsl:text> | </xsl:text>
|
|
<a href="extract.php" title="extract citations from a text and build an appropriate reference list">Extract Citations</a>
|
|
</td>
|
|
<td class="small" align="right" width="105"><a href="http://wiki.refbase.net/" title="display help">Help</a></td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="srw:diagnostics">
|
|
<xsl:apply-templates select="diag:diagnostic"/>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="diag:diagnostic">
|
|
<table class="error" align="center" border="0" cellpadding="0" cellspacing="10" width="95%">
|
|
<tr>
|
|
<td valign="top">
|
|
<xsl:text>Error </xsl:text>
|
|
<xsl:value-of select="substring(uri,23)"/>
|
|
<xsl:text> : </xsl:text>
|
|
<b><xsl:value-of select="message"/></b>
|
|
<xsl:if test="details">
|
|
<xsl:text>: </xsl:text>
|
|
<xsl:value-of select="details"/>
|
|
</xsl:if>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<xsl:text>Choose how to proceed: </xsl:text>
|
|
<a href="javascript:history.back()">Go back</a>
|
|
<xsl:text> -OR- </xsl:text>
|
|
<a href="sru.php">New SRU search</a>
|
|
<xsl:text> -OR- </xsl:text>
|
|
<a href="index.php"><xsl:text>Goto </xsl:text><xsl:value-of select="$officialDatabaseName"/><xsl:text> Home</xsl:text></a>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="srw:records">
|
|
<!--
|
|
TODO: uncomment when including previous/next navigation links
|
|
|
|
<table class="pagenav" align="center" border="0" cellpadding="0" cellspacing="10" width="95%" summary="This table holds browse links that link to the results pages of your query">
|
|
<tr>
|
|
<td align="center" valign="bottom">
|
|
<xsl:if test="string-length($previousStartRecord)>0 and $previousStartRecord > 0">
|
|
<a class="x-escape" href="{$databaseBaseURL}sru.php?version=1.1&query=&startRecord={$previousStartRecord}" rel="next">Previous records</a>
|
|
</xsl:if>
|
|
<xsl:if test="string-length($nextStartRecord)>0">
|
|
<xsl:if test="string-length($previousStartRecord)>0 and $previousStartRecord > 0"> | </xsl:if>
|
|
<a class="x-escape" href="{$databaseBaseURL}sru.php?version=1.1&query=&startRecord={$nextStartRecord}" rel="next">Next records</a>
|
|
</xsl:if>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
-->
|
|
<xsl:apply-templates/>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="srw:record">
|
|
<!-- '<xsl:value-of select="position()"/>' shows: first record has position 2, second record has position 4, and so forth -->
|
|
<xsl:if test="position() > 2">
|
|
<hr class="results" align="center" width="90%" />
|
|
</xsl:if>
|
|
<table class="results" align="center" border="0" cellpadding="0" cellspacing="7" width="90%" summary="This table holds a database record">
|
|
<tr>
|
|
<td colspan="2">
|
|
<h4>Record number: <xsl:value-of select="srw:recordPosition"/></h4>
|
|
</td>
|
|
</tr>
|
|
<xsl:apply-templates select="srw:recordData/mods:mods"/>
|
|
</table>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="srw:recordData/mods:mods">
|
|
|
|
<xsl:choose>
|
|
|
|
<xsl:when test="child::*">
|
|
<tr>
|
|
<td colspan="2">
|
|
<b>
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</b>
|
|
</td>
|
|
</tr>
|
|
<xsl:apply-templates mode="level2"/>
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
<tr>
|
|
<td width="350pt">
|
|
<b>
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</b>
|
|
</td>
|
|
<td>
|
|
<xsl:call-template name="formatValue">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
</td>
|
|
</tr>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template name="formatValue">
|
|
<xsl:param name="name"/>
|
|
|
|
<xsl:choose>
|
|
|
|
<!-- DOI -->
|
|
<xsl:when test="$name='identifier' and @type='doi'">
|
|
<a href="http://dx.doi.org/{text()}">
|
|
<xsl:value-of select="text()"/>
|
|
</a>
|
|
</xsl:when>
|
|
|
|
<!-- ISBN -->
|
|
<xsl:when test="$name='identifier' and @type='isbn'">
|
|
<a href="http://isbn.nu/{text()}">
|
|
<xsl:value-of select="text()"/>
|
|
</a>
|
|
</xsl:when>
|
|
|
|
<!-- ISSN -->
|
|
<xsl:when test="$name='identifier' and @type='issn'">
|
|
<a href="http://journalseek.net/cgi-bin/journalseek/journalsearch.cgi?query={text()}&field=allFields">
|
|
<xsl:value-of select="text()"/>
|
|
</a>
|
|
</xsl:when>
|
|
|
|
<!-- permanent refbase URL (e.g. <http://beta.refbase.net/show.php?record=12>) -->
|
|
<xsl:when test="contains(text(),concat('exported from refbase (',$databaseBaseURL,'show.php?record='))">
|
|
<xsl:variable name="refbaseURL" select="substring(text(),24,string-length(substring-before(substring(text(),24),'), last updated')))"/><!-- extracts the refbase URL from the notes string -->
|
|
<xsl:variable name="lastUpdatedInfo" select="substring-after(text(),$refbaseURL)"/><!-- extracts the string after the refbase URL from the notes string -->
|
|
<xsl:text>exported from refbase (</xsl:text>
|
|
<a href="{$refbaseURL}">
|
|
<xsl:text>record </xsl:text><xsl:value-of select="translate($refbaseURL,translate($refbaseURL,'0123456789',''),'')"/><!-- removes all characters except digits from string -->
|
|
</a>
|
|
<xsl:value-of select="$lastUpdatedInfo"/>
|
|
</xsl:when>
|
|
|
|
<!-- URL -->
|
|
<xsl:when test="$name='url'">
|
|
<a href="{text()}">
|
|
<xsl:value-of select="text()"/>
|
|
</a>
|
|
</xsl:when>
|
|
|
|
<xsl:when test="$name='identifier' and @type='uri'">
|
|
<a href="{text()}">
|
|
<xsl:value-of select="text()"/>
|
|
</a>
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
<xsl:value-of select="text()"/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="*" mode="level2">
|
|
|
|
<xsl:choose>
|
|
|
|
<xsl:when test="child::*">
|
|
<tr>
|
|
<td colspan="2">
|
|
<div class="level2">
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<xsl:apply-templates mode="level3"/>
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
<tr>
|
|
<td class="label">
|
|
<div class="level2">
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</div>
|
|
</td>
|
|
<td class="data">
|
|
<xsl:call-template name="formatValue">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
</td>
|
|
</tr>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="*" mode="level3">
|
|
|
|
<xsl:choose>
|
|
|
|
<xsl:when test="child::*">
|
|
<tr>
|
|
<td colspan="2">
|
|
<div class="level3">
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<xsl:apply-templates mode="level4"/>
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
<tr>
|
|
<td class="label">
|
|
<div class="level3">
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</div>
|
|
</td>
|
|
<td class="data">
|
|
<xsl:call-template name="formatValue">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
</td>
|
|
</tr>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="*" mode="level4">
|
|
|
|
<xsl:choose>
|
|
|
|
<xsl:when test="child::*">
|
|
<tr>
|
|
<td colspan="2">
|
|
<div class="level4">
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<xsl:apply-templates mode="level5"/>
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
<tr>
|
|
<td class="label">
|
|
<div class="level4">
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</div>
|
|
</td>
|
|
<td class="data">
|
|
<xsl:call-template name="formatValue">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
</td>
|
|
</tr>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="*" mode="level5">
|
|
|
|
<xsl:choose>
|
|
|
|
<xsl:when test="child::*">
|
|
<tr>
|
|
<td colspan="2">
|
|
<div class="level5">
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<xsl:apply-templates mode="level6"/>
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
<tr>
|
|
<td class="label">
|
|
<div class="level5">
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</div>
|
|
</td>
|
|
<td class="data">
|
|
<xsl:call-template name="formatValue">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
</td>
|
|
</tr>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="*" mode="level6">
|
|
<tr>
|
|
<td class="label">
|
|
<div class="level6">
|
|
<xsl:call-template name="longName">
|
|
<xsl:with-param name="name">
|
|
<xsl:value-of select="local-name()"/>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
|
|
<xsl:call-template name="attr"/>
|
|
</div>
|
|
</td>
|
|
<td class="data">
|
|
<xsl:value-of select="text()"/>
|
|
</td>
|
|
</tr>
|
|
</xsl:template>
|
|
|
|
|
|
|
|
<xsl:template name="longName">
|
|
<xsl:param name="name"/>
|
|
|
|
<xsl:choose>
|
|
|
|
<xsl:when test="$dictionary/entry[@key=$name]">
|
|
<xsl:value-of select="$dictionary/entry[@key=$name]"/>
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
<xsl:value-of select="$name"/>
|
|
</xsl:otherwise>
|
|
|
|
</xsl:choose>
|
|
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template name="attr">
|
|
|
|
<xsl:for-each select="@type|@point">:<xsl:call-template name="longName"><xsl:with-param name="name"><xsl:value-of select="."/></xsl:with-param></xsl:call-template></xsl:for-each>
|
|
|
|
<xsl:if test="@authority or @edition">
|
|
|
|
<xsl:for-each select="@authority">(<xsl:call-template name="longName"><xsl:with-param name="name"><xsl:value-of select="."/></xsl:with-param></xsl:call-template></xsl:for-each>
|
|
<xsl:if test="@edition">Edition <xsl:value-of select="@edition"/></xsl:if>)</xsl:if>
|
|
|
|
<xsl:variable name="attrStr">
|
|
|
|
<xsl:for-each select="@*[local-name()!='edition' and local-name()!='type' and local-name()!='authority' and local-name()!='point']">
|
|
|
|
<xsl:value-of select="local-name()"/>="<xsl:value-of select="."/>",</xsl:for-each>
|
|
</xsl:variable>
|
|
|
|
<xsl:variable name="nattrStr" select="normalize-space($attrStr)"/>
|
|
|
|
<xsl:if test="string-length($nattrStr)">(<xsl:value-of select="substring($nattrStr,1,string-length($nattrStr)-1)"/>)</xsl:if>
|
|
</xsl:template>
|
|
|
|
|
|
</xsl:stylesheet>
|