Zeitschriftenverzeichnis via SRU

„Welche Zeitschriften hat die Bibliothek abonniert?“ Diese Frage stellen neue Bibliotheksnutzer meist als eine der ersten, wenn sie das Informationsangebot einer Bibliothek kennenlernen wollen. Wer sich über aktuelle Entwicklungen innerhalb seines Fachgebietes auf dem Laufenden halten will, greift auf Fachzeitschriften zurück, da diese noch immer zu den  wichtigsten Informationsquellen zählen. Für viele elektronische Zeitschriften gilt das wegen ihrer jederzeitigen Verfügbarkeit sogar in besonderem Maße.

Funktionen eines Zeitschriftenverzeichnisses

Damit sich potenzielle Leser schnell einen Überblick über die für sie relevanten Zeitschriften verschaffen können, bieten viele Bibliotheken neben ihren Onlinekatalogen separate Zeitschriftenverzeichnisse an, die nicht nur eine alphabetische, sondern häufig auch eine thematische Übersicht ermöglichen. In Behördenbibliotheken orientiert sich diese praktischerweise an den Aufgaben der Behörde.

Auch über die Nutzungsmöglichkeiten informiert das Zeitschriftenverzeichnis: handelt es sich um eine gedruckte Ausgabe, die im Umlauf bezogen werden kann oder um eine elektronische Zeitschrift, bei deren Nutzung besondere Lizenzbedingungen zu beachten sind? Über die jeweiligen Lizenz- und Nutzungsrechte gibt beispielsweise eine durch die Elektronische Zeitschriftenbibliothek (EZB) generierte Liste detailliert Auskunft.

Noch informativer sind Zeitschriftenverzeichnisse, die zusätzlich zu einzelnen Zeitschriftentiteln deren aktuelle Inhaltsverzeichnisse anzeigen, so  dass sich der Leser vorab informieren und evtl. gezielt einzelne Aufsätze bestellen kann.

Manuelle Bearbeitung vs. Schnittstelle

In manchen Bibliotheken werden Zeitschriftenlisten (semi-)manuell erstellt und als HTML-Seiten oder PDF-Dokumente zugänglich gemacht. Die Nachteile der manuellen Bearbeitung liegen auf der Hand: Daten müssen doppelt eingegeben und korrigiert werden. Da sich Zeitschriftendaten häufig ändern, kann der Aufwand zur Aktualisierung sehr hoch sein. Der Vorteil einer manuellen Bearbeitung liegt dagegen in der Möglichkeit, das Verzeichnis vollkommen individuell gestalten zu können.

Wird die Liste über eine Schnittstelle direkt aus der Katalogdatenbank heraus erzeugt, entfällt natürlich der Aufwand zur Aktualisierung. Individuelle Anpassungen sind allerdings nur möglich, wenn die Liste manuell nachbearbeitet werden.

SRU-Schnittstelle des GBV

Im Folgenden wird beschrieben, wie mit Hilfe der SRU-Schnittstelle (SRU = Search/Retrieve via URL) ein Zeitschriftenverzeichnis generiert werden kann, das gedruckte und elektronische Ausgaben gleichermaßen umfasst. Über die Anzeige der Zeitschriftendaten hinaus weist es  folgende Funktionen auf:

  • Umlaufbestellung per vorformulierter E-Mail
  • Anzeige eines Inhaltsverzeichnisses (sofern im GBV vorhanden)
  • Verlinkung auf die EZB

Die Schnittstelle erlaubt es, Daten aus verschiedenen Datenbanken auszulesen und in unterschiedlichen Formaten auszugeben. 

Datenbankabfrage

Mit folgendem URL (s.u.) kann im ANB-Katalog via SRU recherchiert werden. Die Ergebnismenge lässt sich durch diverse Parameter (Zahl der angezeigten Titel, Sortierung, Suchschlüssel etc.) beeinflussen.

http://sru.gbv.de/opac-de-616?version=1.1&operation=searchRetrieve&query=pica.lsg=ZZM05.00.00.00&maximumRecords=55&sortKeys=title,,1&recordSchema=turbomarc

Anmerkungen zu einzelnen Parametern

  • opac-de-616 (Schlüssel für den ANB-Katalog)
  • pica.lsg (Suchschlüssel für eine lokale Systematik, der nach Absprache mit der Verbundzentrale eingerichtet wurde.) Hier evtl. andere Suchschlüssel verwenden: pica.all, pica.tit ….) s. Liste 
  • recordSchema=turbomarc (Datenformat: turbomarc ist umfangreich und enthält die Bestandsdaten. Man kann zunächst einfache Formate ausprobieren, z.B. recordSchema=dc [Dublin Core])
  • sortKeys=title,,1 (Sortierung nach Titeln, alphabetisch absteigend)

Auslesen der Daten

Die Daten werden durch ein PHP-Skript (s.u.) mit Hilfe des DOM-Parsers ausgelesen und als HTML-Seite angezeigt. Dem Skript wird als Variable die Notation der Systematik übergeben, so dass es flexibel einsetzbar ist.

http://www.ahb.niedersachsen.de/sru/ahbzs_parser.php?notation=ZZM05.04.00.00

Präsentation des Verzeichnisses

Das Verzeichnis besteht aus einer  HTML-Seite mit einem Auswahlmenü und dem PHP-Skript, welches zu den einzelnen Menüpunkten mit der jeweiligen Notation aufgerufen wird. Für das Verzeichnis werden die Javascript-Bibliotheken von  jQuery und jQuery UI genutzt.

Zeitschriftenverzeichnis:
http://www.ahb.niedersachsen.de/sru/ahbzs.htm

Folgendes ist bei der Verwendung des Skripts zu beachten:

  • Der Umlaufbutton wird nur dann erzeugt, wenn die lokale Bestandsangabe (Kat. 7121) offen ist, also ein „-“ am Ende steht.
  • Der Onlinebutton wird erzeugt, wenn eine Onlineausgabe vorhanden ist oder wenn parallel zur nachgewiesenen Printausgabe eine Onlineausgabe existiert.
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>Zeitschriftenverzeichnis</title>

<style type='text/css'>
body {
font-family: Sans-Serif, Arial;
font-size: 12px;
}

ol {
margin-left: 4px;
margin-top: 1px;
margin-bottom: 1px;
}

li {
margin-top: 2px;
margin-bottom: 13px;
border-bottom: 1px dotted #222222;
padding: 19px;
font-size: 12px;
}

a:link.bib { border: 1px solid silver; border-color: #BFBFBF; padding: 3px; border-radius:3px;  background-color: #F6F6F6; color:#494949; text-decoration:none; font-family: Sans-Serif, Arial;}
a:visited.bib { border: 1px solid silver; border-color: #BFBFBF; padding: 3px; border-radius:3px;  background-color: #F6F6F6; color:#494949; text-decoration:none; font-family: Sans-Serif, Arial;}
a:hover.bib { border: 1px solid silver; border-color: #BFBFBF; padding: 3px; border-radius:3px;  background-color: #C8C8C8; color:#494949; text-decoration:none; font-family: Sans-Serif, Arial;}

a:link { color:#494949; text-decoration:none; font-family: Sans-Serif, Arial;}
a:visited { color:#494949; text-decoration:none; font-family: Sans-Serif, Arial;}
a:active { color:#494949; text-decoration:none; font-family: Sans-Serif, Arial;}
a:hover { color:#FF7F00;text-decoration:underline; font-family: Sans-Serif, Arial;}

  h2 {margin-bottom: 2px; color: #69B577; font-size: 18pt;}
  h3 {margin-top: 25px; margin-bottom: 1px; margin-left: 60px; color: rgb(120,120,120); font-size: 12pt; font-weight: bold;}
  h4 {margin-top: 2px; margin-bottom: 1px; color: rgb(120,120,120); font-size: 10pt; font-weight: normal;}
  h5 {margin-top: 1px; margin-bottom: 2px; color: rgb(120,120,120); font-size: 12pt;}
</style>

</head>
<body>

<?php

$anzeige = $_GET["notation"];

if($anzeige == "ZZM05.*") {
echo "<h3>Zeitschriften</h3>";
	}
if($anzeige == "ZZM05.00.00.00") {
echo "<h3>Gesetzblätter</h3>";
	}
if($anzeige == "ZZM05.00.01.00") {
echo "<h3>Recht, Allgemeines</h3>";
	}
// ...
// Hier folgen evtl. weitere Ersetzungen.

// Ohne Proxy
$url='http://sru.gbv.de/opac-de-616?version=1.1&operation=searchRetrieve&query=pica.lsg%3D'.  $_GET["notation"]. '*&maximumRecords=55&sortKeys=title,,1&recordSchema=turbomarc';

// Einlesen der Ergebnismenge in eine Variable
$code = @file_get_contents($url);

// XML DOM-Parser
$dom = new DOMDocument();
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($code);

// Pfad im DOM
// zs:record -> zs:recordData  -> r -> d245 -> sa -> Inhalt/Text

echo "<ol>";
$i=0;
// zs:record zs = namespace record = tag; zs: weglassen
$records = $dom -> getElementsByTagName('record'); // Finde Datensaetze

foreach ($records as $record) {

$items = $record->getElementsByTagName('d245');

foreach ($items as $item) {
   $sa = $item -> getElementsByTagName('sa');
   $titel = $sa -> item(0)-> nodeValue;
   $titel = preg_replace('/[:=]/', ' ', $titel);
   $sb = $item -> getElementsByTagName('sb');
   $titel_zusatz = $sb -> item(0) -> nodeValue;
   $titel_zusatz = preg_replace('/[\/]/', ' ', $titel_zusatz);
   $sc = $item -> getElementsByTagName('sc');
   $hrsg = $sc -> item(0)-> nodeValue;
   $hrsg = preg_replace('/hrsg/i', '', $hrsg);
   $hrsg = preg_replace('/[\.:]/', '', $hrsg);
}

$items = $record -> getElementsByTagName('d260');

foreach ($items as $item) {
   $sa = $item -> getElementsByTagName('sa');
   $ort = $sa -> item(0)-> nodeValue;
   $ort = preg_replace('/[;]/', '; ', $ort);
   $sb = $item -> getElementsByTagName('sb');
   $verlag = $sb -> item(0)-> nodeValue;
   $sc = $item -> getElementsByTagName('sc');
   $zeitraum = $sc -> item(0) -> nodeValue;
 }

// Fortsetzung
unset ($forts);
$items = $record -> getElementsByTagName('d785');
foreach ($items as $item) {
   $si = $item -> getElementsByTagName('si');
   $fort = $si -> item(0) -> nodeValue;
   $st = $item -> getElementsByTagName('st');
   $fort_tit = $st -> item(0) -> nodeValue;
         if (preg_match ("/Forts\./i", $fort)) {
          $forts = $fort_tit;
          }
    }

// Vorgänger
unset ($vorg);
$items = $record -> getElementsByTagName('d780');
foreach ($items as $item) {
   $si = $item -> getElementsByTagName('si');
   $vor = $si -> item(0) -> nodeValue;
   $st = $item -> getElementsByTagName('st');
   $vorg_tit = $st -> item(0) -> nodeValue;
         if (preg_match ("/Vorg\./i", $vor)) {
          $vorg = $vorg_tit;
           }
     }

$items = $record -> getElementsByTagName('d362');

foreach ($items as $item) {
	 $sa = $item -> getElementsByTagName('sa');
   $erscheinungszeitraum = $sa -> item(0) -> nodeValue;
  }

// Swets - Vermerk fuer Inhaltsverzeichnis
  unset($swets);
  $items = $record -> getElementsByTagName('d024');

  foreach ($items as $item) {
   $s2 = $item -> getElementsByTagName('s2');
   $swets = $s2 -> item(0) -> nodeValue;
   }

// OLC-SSG - Vermerk fuer Inhaltsverzeichnis
unset($olcssg);
$items = $record->getElementsByTagName('d084');

  foreach ($items as $item) {
   $s2 = $item -> getElementsByTagName('s2');
   $olcssg = $s2 -> item(0) -> nodeValue;
   }

// Bestandsangabe

unset($einzelbestand);
unset($bestand);
unset($kennung);
unset($umlauf_button);

 $items = $record -> getElementsByTagName('d954');

foreach ($items as $item) {

// sd ist mehrfach belegt, signatur steht im ersten eintrag
   $d954_sd = $item -> getElementsByTagName('sd');
	 $signatur = $d954_sd -> item(0) -> nodeValue;

   $d954_sg = $item -> getElementsByTagName('sg');
	 foreach ($d954_sg as $eb) {
    $einzelbestand = $eb -> nodeValue;
   }

	$d954_sk = $item -> getElementsByTagName('sk');
	foreach ($d954_sk as $sk) {
    $best_komm = $sk -> nodeValue;
   }

  $d954_sx = $item -> getElementsByTagName('sx');
	foreach ($d954_sx as $kenn) {
	 $kennung = $kenn -> nodeValue;
   }

	if($kennung == "3235/005" && !empty($einzelbestand)) {
	$bestand = $einzelbestand;
	$bestand = preg_replace('/Bestand:/','', $bestand);
	$signatur_ml = $signatur;
  }

  if(preg_match('/Online/', $signatur_ml)) {
		$umlauf_button = "Umlaufbutton";
	  }
   }

// EZB-Link
unset($ezb);
unset($ezb_test);
unset ($online_button1);

$items = $record -> getElementsByTagName('d856');

foreach ($items as $item) {

$d856_su = $item -> getElementsByTagName('su');
	foreach ($d856_su as $ezblink) {
   $ezb_test = $ezblink -> nodeValue;
  }
    if(preg_match("/www\.bibliothek\.uni-regensburg\.de/", $ezb_test)){
      $ezb = $ezb_test;

  $online_button1 = '&nbsp;&nbsp;&nbsp;<a class="bib" href="'. $ezb. '&bibid=MLN"'. ' target="_blank" title="Falls für das ML lizenziert: Zugang zum Volltext via Elektronische Zeitschriftenbibliothek">Online</a>';
     }
    }

// ISSN
$items = $record->getElementsByTagName('d022');

foreach ($items as $item) {
	 $sa = $item -> getElementsByTagName('sa');
   $issn = $sa -> item(0) -> nodeValue;

   if (preg_match ("/autorisierte/", $issn)){
      $issn_autorisiert = $issn;
      $issn_autorisiert = preg_replace('/\(autorisierte ISSN\)/', '', $issn_autorisiert);
  }
}

// ZDB-Nr. für EZB-Link, falls Online-Ausgabe
unset($zdb);
unset($onl1);
unset($onl);
unset ($online_button2);

$items = $record->getElementsByTagName('d787');

foreach ($items as $item) {
	 $sw = $item -> getElementsByTagName('sw');
	 $si = $item -> getElementsByTagName('si');
   $zdb = $sw -> item(0) -> nodeValue;
   $zdb = preg_replace('/\(.*\)/', '', $zdb);
   $zdb = preg_replace('/\-.*/', '', $zdb);
   $zdb = preg_replace('/(\d{7}).*/', '$1', $zdb);

   $onl1 = $si -> item(0) -> nodeValue;
      if (preg_match ("/Online-Ausg/i", $onl1)) {
    onl = $onl1;
   $online_button2 = '&nbsp;&nbsp;&nbsp;<a class="bib" href="http://ezb.uni-regensburg.de/?'. $zdb. '&bibid=MLN"'. ' target="_blank" title="Falls für das ML lizenziert: Zugang zum Volltext via Elektronische Zeitschriftenbibliothek">Online</a>';
  }
 }

$items = $record->getElementsByTagName('c001');
$ppn = $items->item(0)-> nodeValue;

// Ausgabe
echo '<li><b><a href="http://gso.gbv.de/DB=9.235//PPNSET?PPN='. $ppn. '" target="_blank">'. $titel. '</a></b>';

    if (!empty($titel_zusatz)) {
        echo " <br />". $titel_zusatz;
     }

    if (!empty($hrsg) && empty($titel_zusatz)) {
        echo " <br /> Hrsg.: ". $hrsg;
       }

    if (!empty($hrsg) && !empty($titel_zusatz)) {
        echo " / Hrsg.: ". $hrsg;
    }

    if (!empty($ort)) {
        echo " <br />". $ort;
    }

    if (!empty($verlag)) {
        echo " : ". $verlag;
    }

    if (!empty($issn_autorisiert)) {
    echo "<br />ISSN: ". $issn_autorisiert;
    }

    if (!empty($forts)) {
        echo "<br />Fortsetzung: ". $forts;
    }

    if (!empty($vorg)) {
        echo "<br />Vorher: ". $vorg;
    }

    if (!empty($bestand)) {
        $bestand = "&nbsp;&nbsp;&nbsp;Bestand: ". $bestand;
    }

echo '<br />Erscheinungszeitraum: <i>'. $erscheinungszeitraum. '</i><br /><br />Signatur: '. $signatur_ml. $bestand. '<br /><br />';

 if (preg_match ("/-$/i", $bestand)) {
    			echo '<a class="bib" href="mailto:bibliothek@example.com?subject=Umlauf&body=Bitte in Umlauf eintragen:'. $titel. '" " target="_blank" title="Umlauf per vorformulierter E-Mail bestellen">Umlauf</a>&nbsp;&nbsp;&nbsp;';
				} else {
    			echo "";
            }

if (!empty($ppn)) {
          $url_opac = "http://opac.tib.uni-hannover.de/DB=9.5/XMLPRS=N/PPN?PPN=". $ppn;
      echo '<a class="bib" href="'. $url_opac. '" title="Nachweis im Katalog des ML" target="_blank">Katalog</a>';
         }

$inhvz_button = '&nbsp;&nbsp;&nbsp;<a class="bib" href="http://gso.gbv.de/DB=2.2/CNA?PPN='. $ppn. '&IPNSRC=0/SHRTST=15" title="Alle Aufsätze dieser Zeitschrift im Verbundkatalog" target="_blank"> Inhaltsverzeichnis</a>';

  if (preg_match ("/swets/i", $swets)) {
  	 $swets = 1;
     }

 if (preg_match ("/olc-ssg/i", $olcssg)) {
 	  $olcssg = 1;
    }

  if($swets == 1 || $olcssg == 1) {
  	echo $inhvz_button;
  	}
if (!empty($online_button1) && empty($online_button2)) {
   echo $online_button1;
    }

// Wenn beide gesetzt sind, soll der direkte EZB-Link erschienen.
if (!empty($online_button2) && !empty($online_button1)) {
   echo $online_button1;
    }

if (!empty($online_button2) && empty($online_button1)) {
    echo $online_button2;
    }

echo '</li>';

$i++;
}
echo "</ol>";
?>

</body>
</html>