Erstellung von Publikationslisten aus Katalogen
Für verschiedene Zwecke (Bibliographien, Neuerwerbungen etc.) ist es wünschenswert, aus Bibliothekskatalogen Publikationslisten (aka Literaturlisten) im HTML-Format oder in anderen Formaten zu erstellen und diese Listen auf einer Webseite anzubieten. Wenn Publikationen in einem über entsprechende Schnittstellen zugreifbaren Katalog gespeichert sind, können Publikationslisten automatisch aus den Katalogen erzeugt werden.
publikationslisten.php
Die PHP-Bibliothek publikationsliste.php (Download siehe unten) stellt verschiedene Funktionen bereit, mit denen auf (PICA-)Kataloge zugegriffen und die Erzeugung von Publikationslisten gesteuert werden kann. Im Wesentlichen sind dies zwei Hilfsfunktionen:
- Mit get_ppns_from_psi können PPNs aus einem PSI-System abgefragt werden
- Mit get_ppns_from_collectionws() können PERLIS-Kollektionen ueber den PERLIS-Webservice abgefragt werden
- Mit get_records_via_unapi werden mehrere Datensätze über unAPI geholt
Hier ein einfaches Beispiel:
require 'publikationsliste.php'; $ppns = get_ppns_from_psi ( "http://gso.gbv.de/DB=2.1/", "1004", "von Foerster, Heinz" ); $records = get_records_via_unapi ( "http://unapi.gbv.de/", $ppns, "isbd", "gvk:ppn:" ); print "<h1>Publikationen von Heinz von Foerster im GVK</h1>"; foreach ($records as $ppn => $record) { print "[<a href='http://gso.gbv.de/DB=2.1/PPNSET?PPN=$ppn'>GBV</a>] "; print htmlspecialchars($record); print "<hr/>"; }
Logging
Ohne Logging bleibt weitgehend unbekannt, wie ein Webangebot genutzt wird und ob irgendwo Fehler auftreten. Die PHP-Bibliothek stellt grundlegende Logging-Funktionen bereit. Zum Einschalten des Logging genügt es, vor der Einbindung der Bibliothek die Variable logfile in der Konfiguration zu setzen. Die angegebene Datei muss natürlich schreibbar sein. Zusätzlich kann mit loglevel festgelegt werden, wie detailliert geloggt werden soll.
$publistconf["logfile"] = "publist.log"; $publistconf["loglevel"] = 2;
Formatierung der Ausgabe
Die einzelnen Datensätze sind erstmal nur in den Formaten verfügbar, die vom unAPI-Server unterstützt werden. Um die Ausgabe nach den eigenen Bedürfnissen anzupassen, müssen die Datensätze deshalb weiterverarbeitet werden. Für XML-Formate kann dies Beispielsweise mit XSLT geschehen. Im Folgenden Beispiel werden Datensätze im MODS-Format geholt und mit XSLT nach HTML umgewandelt.
$ppns = get_ppns_from_psi("http://gso.gbv.de/DB=2.1/", "1004", "von Foerster, Heinz"); $records = get_records_via_unapi("http://unapi.gbv.de/", $ppns, "mods", "gvk:ppn:"); $xsl = new XSLTProcessor(); $doc = new DOMDocument(); $doc->load("mods2html.xsl"); $xsl->importStyleSheet($doc); foreach ($records as $ppn => $record) { $doc->loadXML($record); $html = $xsl->transformToXML($doc); print $html; print "<hr/>"; }
Performanter ist es, die Datensätze erst zu einer XML-Datei zusammenzufassen und anschließend mit XSLT umzuwandeln. Die umfangreichste Möglichkeit der Verarbeitung und Anzeige besteht, indem die vollen Datensätze im PICA XML Format geholt und weiterverarbeitet werden.
Caching
Damit der Katalog nicht bei jeder Anzeige der Publikationsliste neu abgefragt werden muss, stellt die PHP-Bibliothek Methoden zum Caching der gesamten Ausgabe bereit. Zum Einschalten des Caching genügt es, vor der Einbindung der Bibliothek die Variable cachefile in der Konfiguration zu setzen. Die angegebene Datei muss natürlich schreibbar sein. Mit interval kann festgelegt werden, wann der Cache geleert werden soll. Falls nichts angegeben ist, wird ein Tag als Interval angenommen, so dass die Publikationsliste täglich neu erstellt wird.
$publistconf["cachefile"] = "pubcache.html"; $publistconf["interval"] = 60*60; # Caching-Interval in Sekunden require 'Publikationsliste.php'; # gibt ggf. Cache aus statt Skript fortzuführen
Es wird empfohlen, die Erstellungszeit der Ausgabe mit auf der Seite auszugeben, damit klar ist, wann die Seite erstellt wurde. Dies ist mit einer einfachen Anweisung am Ende des Skriptes möglich:
print "<p><i>Zuletzt aktualisiert: " . date("d.m.Y, H:i:s") . "</i></p>";
Damit der Cache-Mechanismus funktioniert, darf das eigene Skript keine der Output Control Funktionen (flush(), ob_*()) verwenden. Zu Beachten ist auch, dass im Debugging-Modus die Logging-Meldungen ebenfalls gecacht werden, was unter Umständen zu Verwirrung führen kann.
Leeren des Cache
Nach Ablauf des Caching-Intervals wird der Cache automatisch geleert. Zu beachten ist jedoch, dass die Publikationsliste erst durch einen HTML-Aufruf der Seite wieder neu erzeugt wird. Gerade bei langen Listen muss dadurch der erste Nutzer ggf. etwas länger warten - außerdem kann es vorkommen, dass das PHP-Skript bei zu langer Laufzeit vom Server beendet wird. Für umfangreiche Listen, deren Verarbeitung längere Zeit dauert, empfiehlt es sich deshalb, das Skript der Seite per cronjob regelmäßig vom Server aus aufzurufen.
Das Leeren des Cache kann auch mit dem URL-Parameter purge erzwungen werden. Dieses Verhalten lässt sich mit dem Konfigurations-Parameter purge ändern:
$publistconf["purge"] = 1; # nie cachen $publistconf["purge"] = 0; # immer cachen (sofern im Interval) $publistconf["purge"] = $_REQUEST['purge']; # Standardwert
Statt das Skript nach Aufruf von require 'Publikationsliste.php'; weiter auszuführen wird der Cache ausgegeben wenn folgenden Bedingungen erfüllt sind:
- Es ist eine Cache-Datei angegeben ($publistconf["cachefile"])
- Die Cache-Datei existiert und ist größer als Null Bytes
- Die Cache-Datei ist nicht älter als die aktuelle Zeit minus das Cache-Intervall ($publistconf["cachefile"], Standardwert 1 Tag)
- Der Parameter 'purge' ist nicht angegeben oder auf '0' gesetzt.
Mehrere Cache-Dateien
Wenn die erzeugte Publikationsliste von weiteren Parametern abhängt (z.B. verschiedene Suchanfragen) wird für jede unterschiedliche Liste eine eigene Cache-Datei benötigt. Dies lässt sich dadurch steuern indem, die Variable cachefile dynamisch auf einen Dateinamen gesetzt wird, der sich aus einem Hashwert der normalisierten Parameter ergibt. Im Folgenden Beispiel können mit einem Skript unterschiedliche Listen für verschiedene Suchen nach Personennamen erstellt werden:
$person = $_REQUEST["person"]; # URL-Parameter $person = trim(ereg_replace(' +', ' ', $person)); # normalize spaces $publistconf["cachefile"] = "cachedir/" . md5($person)); require 'Publikationsliste.php'; $ppns = get_ppns_from_psi ( "http://gso.gbv.de/DB=2.1/", "1004", $person ); ...
Sortierung
Sollen die Einträge einer Liste sortiert ausgegeben werden, so muss entweder die Abfrage der Datenquelle mit get_ppns_from_psi() stattfinden, so dass die Titel gleich in der richtigen Sortierung vorliegen, oder die Datensätze müssen in der eigenen Anwendung nachträglich sortiert werden.
Die Sortierung durch das PSI-System ist die komfortabelste Lösung und wird in Beispiel 1 vorgeführt. Allerdings lassen sich auf diese Weise die Datensätze nicht nach mehreren Kriterien sortieren. In Beispiel 2 wird daher eine nachträgliche, softwareseitige Sortierung nach Verfasser (alphabetisch aufsteigend), Erscheinungsjahr (chronologisch absteigend) und Titel (alphabetisch aufsteigend) vorgeführt. Dieses Verfahren kann bei größeren Treffermengen recht rechenintensiv sein, weshalb sich ein Caching des Ergebnisses empfiehlt. PERLIS-Ergebnisliste müssen stets nachträglich sortiert werden, da der PERLIS-Webservice derzeit keine Sortierung erlaubt.
Weitere Beispiele
Am einfachsten ist die Funktionsweise und Anwendung von publikationsliste.php anhand von Beispielen zu verstehen. Folgende Beispiele werden bereit gestellt und können für eigene Zwecke angepasst werden. Wenn Sie selber ein gutes Beispiel entwickelt haben, das hier präsentiert werden könnte teilen Sie es uns bitte mit!
- Beispiel 1: Anfrage an GVK-PSI, Sortierung nach Autor durch GVK-PSI, Metadaten im ISBD-Format und Darstellung in HTML
- Beispiel 2: Anfrage an GVK-PSI, Metadaten im RIS-Format, anschließende Sortierung nach Autor, Jahr und Titel und Darstellung in HTML
- Beispiel 3: Anfrage an PERLIS, Metadaten im ISBD-Format und Darstellung in HTML
- Beispiel 4: Anfrage an Lokalsystem-PSI, Metadaten im ISBD-Format und Darstellung der ersten hundert Zeichen in HTML
- Beispiel 5: Anfrage an Lokalsystem-PSI, Metadaten im ISBD-Format und Darstellung in HTML mit DAIA-Verfuegbarkeitspruefung
- Beispiel 6: Anfrage an GVK-PSI, Metadaten im MODS-Format und Transformation mittels XSL nach HTML
Publikationslisten als PDF oder RTF
Zur Erzeugung von Publikationslisten als PDF sowie als RTF (letzteres auch von Word lesbar) bieten sich folgende Methoden an:
- Ausgehend von einem XML-Format (Dublin CORE, MODS...) Erzeugung von PDF oder RTF mit XSL-FO
- Erzeugung von OpenOffice-Dokumenten und Export als PDF bzw. RTF. Ein Vorteil ist, dass die Dokumentenvorlage einfacher mit der Textverarbeitung erstellt werden kann
Ausgabe in verschiedenen Zitierformaten
Zur Ausgabe in verschiedenen Zitationsformaten bietet sich die Citation Style Language an. Im Rahmen der Zotero-Software sind zahlreiche Zitationsformaten als CSL-Dateien verfügbar. Mit Hilfe eines XSLT-Prozessors können die CSL-Stile verwendet werden, um aus MODS-Datensätze Zitierungen zu erzeugen. Allerdings wird dazu XSLT 2.0 benötigt, welches nicht direkt von PHP unterstützt wird. Mit einigem Gebastel (z.B. PHP/JAVA-Bridge und Saxon) lässt sich aber publikationslisten.php um die Unterstützung von CSL erweitern.
Stand der Entwicklung
Die PHP-Bibliothek ist bislang nur ein Prototyp. Sie wurde ausführlich dokumentiert mit vielen Beispielen versehen und wartet darauf, eingesetzt und erweitert zu werden.
Der aktuelle Stand ist unter https://github.com/gbv/publikationslisten-php verfügbar.
Die Vorabversion mit Beispielen und Dokumentation kann hier als ZIP-Archiv heruntergeladen werden.
Verwandte Projekte
- An der TU-Ilmenau gibt es ein Verfahren zur dynamischen Erstellung von Literaturlisten aus dem Katalog und ihre Einbindung in Typo3
- Diese Seite wurde zuletzt am 23. Januar 2013 um 16:59 Uhr geändert.