This is an old revision of the document!
<?php /* Copyright 2008 2009 Goetz Hatop * Goetz Hatop's original Version can be found at * <ftp://ftp.ub.uni-marburg.de/pub/research/unapi.tar.gz> */ /* Copyright 2009 Stephan Rosenke <rosenke@ulb.tu-darmstadt.de> */ /* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* Version: 0.1 */ /* Changelog * * 20091214: Added function "convOutputNice", "getArrayNice", "getBibsonomy", * "getKeysText" and "getKeysBibTex" to class "Picappn". * Handled empty records for dc and rdf. * 20091213: Added function "convOutput" to class "Picappn". * Defined text-format. * Defined bibtex-format. * 20091211: Added function "final_result". * 20091210: Put class "Picappn" to PicaRecord.php. * Ordered functions alphabetically. * Added functions "getArray", "getPlain" and "getText" to class * "Picappn". * Added functions "decodePicaArray", "getArray" and "getPlain" to * class "PicaRecord". * 20091210: Started with Goetz Hatop's version of 2009-12-08 */ $opac_url = "http://pica1l.lhb.tu-darmstadt.de/DB=LHBDA/XML=1.0/PPN?PPN="; //$opac_url = "http://opac.ub.uni-marburg.de/XML=1.0/PPN?PPN="; //$opac_url = "http://cbsopac.rz.uni-frankfurt.de/XML=1.0/PPN?PPN="; //$opac_url = "http://gso.gbv.de/XML=1.0/PPN?PPN="; $bibsonomy_url = "http://www.bibsonomy.org/BibtexHandler?requTask=upload&selection="; /** represents a bibliographic data record from oclc/pica LBS */ class PicaRecord { // 15 dublin core elements http://dublincore.org/documents/dces/ var $contributor, $coverage, $creator, $date, $description, $format; var $identifier, $language, $publisher, $related, $rights, $source; var $subject, $title, $type; // 1 for me var $signatur; function PicaRecord() { //default values $this->type = "Text"; $this->rights = "--"; $this->description = ""; } /** private -- make pica data behave well */ function decodePica($str) { $tag = ""; $res = ""; for ($i=0;$i<=strlen($str)-1;++$i) { $ch = substr($str,$i,1); switch (ord($ch)) { case 31: //information separator one $ch = substr($str,++$i,1); //new tag ahead if ($tag!="") { $res .= "</".$tag.">"; $tag = $this->getTagName($ch); $res .= "<".$tag.">"; } else { $tag = $this->getTagName($ch); $res .= "<".$tag.">"; } break; case 30: //information separator two, another field to follow $res .= "</".$tag.">\n"; $tag = ""; break; case 226: //pica two byte char accent like "é"; $ch = substr($str,++$i,1); // read one char ahead $res .= $this->getCode2($ch); break; default: $res .= $this->getCode($ch); break; } //switch } $res .= "</".$tag.">"; return $res; } /** private -- make pica data behave well and put them to an array*/ function decodePica_array($str) { $tag = ""; $res = ""; for ($i=0;$i<=strlen($str)-1;++$i) { $ch = substr($str,$i,1); switch (ord($ch)) { case 31: //information separator one $ch = substr($str,++$i,1); //new tag ahead $tag = $this->getTagName($ch); break; case 30: //information separator two, another field to follow break; case 226: //pica two byte char accent like "é"; $ch = substr($str,++$i,1); // read one char ahead $res .= $this->getCode2($ch); break; default: $res[$tag] .= $this->getCode($ch); break; } //switch } return $res; } /** public -- transform raw pica data to array */ function getArray($str) { // pica record separator is ascii record separator $lines = explode(chr(30), $str); $res = ""; foreach ($lines as $line) { $in1 = ltrim($line); $ch1 = substr($in1,1,1); //first char between 0-9 if (ord($ch1) >47 && ord($ch1)<58) { $pos = strpos($in1, ' '); $key = substr($in1,0,$pos); $val = substr($in1,$pos+1); $val = $this->decodePica_array($val); $pica_array[$key] = $val; } else { //not valid } } $res = $pica_array; return $res; } /** private -- recode pica charset */ function getCode($ch) { $xx = ord($ch); switch($xx) { //case 30: return "\n"; //information separator two //case 31: return "::"; //information separator one case 10: return "\n"; // ascii line feed // case 60: return "["; case 60: return "<"; // case 62: return "]"; case 62: return ">"; case 64: return ""; // @ pica no sort sign case 209: return "ä"; case 210: return "ö"; case 211: return "ü"; case 216: return "ß"; case 193: return "Ä"; case 194: return "Ö"; case 195: return "Ü"; default: if ($xx<30 || $xx>128) { return "[".$xx."]"; } return $ch; } } /** private -- not complete set of double byte pica characters started with an accent sign */ function getCode2($ch) { switch($ch) { case 'e' : return "é"; case 'u' : return "ú"; case 'a' : return "á"; case 'o' : return "ó"; case 'E' : return "É"; case 'c' : return "ć"; case 's' : return "ś"; case 'z' : return "ś"; default: return $ch; } } /** public -- return simple dublin core record from pica data */ //used by unapi function getDublinCore($str) { $res = $this->getXmlData($str); //parse dublin core if (empty($res)) return ""; $res = "<?xml version=\"1.0\" ?>\n"; $res .="<record>\n"; $res .= "<contributor>".$this->contributor."</contributor>\n"; $res .= "<coverage>".$this->coverage."</coverage>\n"; $res .= "<creator>".$this->creator."</creator>\n"; $res .= "<date>".$this->date."</date>\n"; $res .= "<description>".$this->description."</description>\n"; $res .= "<format>".$this->format."</format>\n"; $res .= "<identifier>".$this->identifier."</identifier>\n"; $res .= "<language>".$this->language."</language>\n"; $res .= "<publisher>".$this->publisher."</publisher>\n"; $res .= "<related>".$this->related."</related>\n"; $res .= "<rights>".$this->rights."</rights>\n"; $res .= "<source>".$this->source."</source>\n"; $res .= "<subject>".$this->subject."</subject>\n"; $res .= "<title>".$this->title."</title>\n"; $res .= "<type>".$this->type."</type>\n"; $res .="</record>\n"; return $res; } /** public -- transform raw pica plus to a more readable diagnostic format */ //used by unapi function getPicaPlus($str) { $res = $this->transcribe_pica_utf8($str); $res = $this->transcribe_pica_rec($res); return $res; } /** private -- rename numeric tags not allowed in xml */ function getTagName($ch) { if (ord($ch) >47 && ord($ch)<58) { return "x".$ch; } else { return $ch; } } /** public -- transform raw pica data to valid xml */ //used by unapi function getXmlData($str) { // pica record separator is ascii record separator $lines = explode(chr(30), $str); $res = ""; foreach ($lines as $line) { $in1 = ltrim($line); $ch1 = substr($in1,1,1); //first char between 0-9 if (ord($ch1) >47 && ord($ch1)<58) { $pos = strpos($in1, ' '); $key = substr($in1,0,$pos); $val = substr($in1,$pos+1); $val = $this->decodePica($val); //$res .= "[$key] [$val]\n"; $res .= "<field tag=\"$key\">$val</field>\n"; //side effect to scan dublin core elements $this->readData($key,$val); } else { //not valid } } return $res; } /** private -- read dublin core elements */ function readData($key, $val) { //switch on first 4 letters to catch 041A/001 switch (substr($key,0,4)) { case '028C': //Sonstige beteiligte bzw. verantwortliche Personen $this->contributor .= " ".$this->readTag($val, "x8"); break; case '201@': //unkown // The spatial or temporal topic of the resource // $this->coverage = $this->readTag($val, "v"); break; case '209S': //unkown. DOI ? //The spatial or temporal topic of the resource $this->identifier = $this->readTag($val, "u"); break; case '028A': //creator $this->creator = $this->readTag($val, "x8"); break; case '028B': //2. und weitere Verfasser // $this->creator .= " ".$this->readTag($val, "x8"); break; case '011@': //date Erscheinungsjahr $this->date = $this->readTag($val, "a"); break; case '004A': //ISBN $this->identifier = $this->readTag($val, "x0"); break; case '009P': //Elektronische Adresse der Personen-Website //related : A related resource. $this->related = $this->readTag($val, "u"); break; case '009Q': //Elektronische Adresse der Online-Ressource //related : A related resource. $this->related = $this->readTag($val, "u"); break; case '034I': //format : file format or dimensions of the resource. $this->format .= " ".$this->readTag($val, "a"); break; case '034D': //Seitenanzahl $this->format .= " ".$this->readTag($val, "a"); break; case '036G': //Ungezählte Schriftenreihen $this->subject = $this->readTag($val, "a")." "; break; case '209A': //Signaturen $this->signatur = $this->readTag($val, "a"); break; case '010@': //language $this->language = $this->readTag($val, "a"); break; case '033A': //publisher $pub1 = $this->readTag($val, "p"); $pub2 = $this->readTag($val, "n"); $this->publisher = $pub1." [".$pub2."]"; break; case '4201': //rights : Information about rights held in and over $this->rights = $this->readTag($val, "a"); break; case '4219': //rights : Information about rights held in and over $this->rights = $this->readTag($val, "a"); break; case '036D': //nicht dokumentiert: Sammelband Gesamtausgabe //source : A related resource from which the described is derived. $this->source = $this->readTag($val, "x8")." "; //$this->source .= $this->readTag($val, "l"); break; case '045B': //DDC $this->subject = "DDC: ".$this->readTag($val, "a"); break; case '045Z': //RVK $this->subject = $this->readTag($val, "a"); break; case '041A': //unknown if ($this->description !== "") $this->description .= ", "; $this->description .= $this->readTag($val, "x8"); break; case '044A': //unknown if ($this->description !== "") $this->description .= ", "; $this->description .= $this->readTag($val, "a"); break; case '044N': //Maschinell erstellte Indexeintraege if ($this->description !== "") $this->description .= ", "; $this->description .= $this->readTag($val, "a"); break; case '044K': //Einzelschlagwort if ($this->description !== "") $this->description .= ", "; $this->description .= $this->readTag($val, "x8"); break; case '041A': //Blackwell subjects if ($this->description !== "") $this->description .= ", "; $this->description .= $this->readTag($val, "x8"); break; case '021A': //Hauptsachtitel $this->title = $this->readTag($val, "a"); $subtitle = $this->readTag($val, "d"); if ($subtitle!="") $this->title .= ": ".$subtitle; break; case '016A': //Materialspezifische Codes für elektronische Ressourcen //type The nature or genre of the resource. $this->type = $this->readTag($val, "a"); break; default: break; } return $res; } /** public -- parse dublin core data */ //client functionality function readDublinCore($str) { $doc = new DomDocument(); $doc -> loadXML($str); $xp = new DomXPath($doc); $this->contributor = $xp->query("/record/contributor")->item(0)->nodeValue; $this->coverage = $xp->query("/record/coverage")->item(0)->nodeValue; $this->creator = $xp->query("/record/creator")->item(0)->nodeValue; $this->date = $xp->query("/record/date")->item(0)->nodeValue; $this->description = $xp->query("/record/description")->item(0)->nodeValue; $this->format = $xp->query("/record/format")->item(0)->nodeValue; $this->identifier = $xp->query("/record/identifier")->item(0)->nodeValue; $this->language = $xp->query("/record/language")->item(0)->nodeValue; $this->publisher = $xp->query("/record/publisher")->item(0)->nodeValue; $this->related = $xp->query("/record/related")->item(0)->nodeValue; $this->rights = $xp->query("/record/rights")->item(0)->nodeValue; $this->source = $xp->query("/record/source")->item(0)->nodeValue; $this->subject = $xp->query("/record/subject")->item(0)->nodeValue; $this->title = $xp->query("/record/title")->item(0)->nodeValue; $this->type = $xp->query("/record/type")->item(0)->nodeValue; return $res; } /** public -- parse dublin core data */ // experimental, does not work function readRDF_DC($str) { $doc = new DomDocument(); $doc -> loadXML($str); $xp = new DomXPath($doc); $this->contributor = $xp->query("/rdf/dc:contributor")->item(0)->nodeValue; $this->coverage = $xp->query("/rdf/dc:coverage")->item(0)->nodeValue; $this->creator = $xp->query("/rdf/dc:creator")->item(0)->nodeValue; $this->date = $xp->query("/rdf/dc:date")->item(0)->nodeValue; $this->description = $xp->query("/rdf/dc:description")->item(0)->nodeValue; $this->format = $xp->query("/rdf/dc:format")->item(0)->nodeValue; $this->identifier = $xp->query("/rdf/dc:identifier")->item(0)->nodeValue; $this->language = $xp->query("/rdf/dc:language")->item(0)->nodeValue; $this->publisher = $xp->query("/rdf/dc:publisher")->item(0)->nodeValue; $this->related = $xp->query("/rdf/dc:related")->item(0)->nodeValue; $this->rights = $xp->query("/rdf/dc:rights")->item(0)->nodeValue; $this->source = $xp->query("/rdf/dc:source")->item(0)->nodeValue; $this->subject = $xp->query("/rdf/dc:subject")->item(0)->nodeValue; $this->title = $xp->query("/rdf/dc:title")->item(0)->nodeValue; $this->type = $xp->query("/rdf/dc:type")->item(0)->nodeValue; return $res; } /** private -- read tag content from string */ function readTag($val, $tag) { $x = strpos($val,"<".$tag.">"); $y = strpos($val,"</".$tag.">"); if ($x===FALSE) return ""; return substr($val,$x+2+strlen($tag),$y-$x-2-strlen($tag)); } /** public -- read XML data */ // client functionality function readXmlData($str) { $lines = explode("\n", $str); //$res = ""; foreach ($lines as $line) { $line = trim($line); if ($line=="") continue; $x = strpos($line, "<field tag="); if ($x!==0) continue; $y = strpos($line, "\"",12); $key = substr($line, 12, $y-12); $z = strpos($line, "</field>"); if ($z===FALSE) continue; $val = substr($line,$y+2, $z-$y-2); $this->readData($key, $val); //$res .= "[$key] [$val]\n"; } //return $res; } /** private -- transcribe separators to diagnostic format */ function transcribe_pica_rec($str) { return strtr( $str, array( "\x1F" => "$", "\x1E" => "\n", "\x0A" => "\n" )); } /** private -- pica charset handling (we want utf8) */ function transcribe_pica_utf8($str) { return strtr( $str, array( "\xD1" => "ä", "\xD2" => "ö", "\xD3" => "ü", "\xD8" => "ß", "\xC1" => "Ä", "\xC2" => "Ö", "\xC3" => "Ü" )); } } //end class PicaRecord /** get a pica record via pica xml web interface and return */ class Picappn { // require php5-curl var $opac; var $url; var $ppn; var $myself; var $prec; // a picarecord //constructor function Picappn() { //probably localhost on a typical pica psi production system global $opac_url; $this->opac = $opac_url; $this->ppn = 0; $this->prec = new PicaRecord(); } /** public -- convert for output using raw array data*/ function convOutput($array,$text,$separator,$category,$subfield,$suffix) { if (empty($array)) return ""; if (!empty($subfield)) { if (empty($array[$category][$subfield])) return ""; $res = $text.$separator.$array[$category][$subfield].$suffix; } else { if (empty($array[$category])) return ""; $res = $text.$separator.$array[$category].$suffix; } return $res; } /** public -- convert for output using nice array data*/ function convOutputNice($array_nice,$array_text,$key,$prefix,$suffix) { if (empty($array_nice)) return ""; if (empty($array_nice[$key])) return ""; $res = $array_text[$key].$prefix.$array_nice[$key].$suffix; return $res; } /** public -- return record as Array */ function getArray() { if ($this->ppn == 0) return ""; $res = $this->getData($this->ppn); $res = $this->prec->getArray($res); return $res; } /** public -- return array with speaking keys */ function getArrayNice($array_raw) { if (empty($array_raw)) return ""; $record = $array_raw; //Type $res['type'] = $record['002@']['x0']; //Author $res['author'] = $record['028A']['x8']; //Editor $res['editor'] = $record['028C']['x8']; //Title $res['title'] = $record['021A']['a']; //Series $res['series'] = $record['036F']['x8']." ".$record['036F']['l']; //Address, especially city $res['address'] = $record['033A']['p']; //Publisher $res['publisher'] = $record['033A']['n']; //Edition $res['edition'] = $record['032@']['a']; //Year $res['year'] = $record['011@']['a']; //ISBNs $res['isbn10'] = $record['004A']['x0']; $res['isbn13'] = $record['004A']['A']; //PPN $res['ppn'] = $record['003@']['x0']; return $res; } /** public -- return BibTex record from pica data */ //used by bibsonomy function getBibsonomy() { if ($this->ppn == 0) return ""; $record_raw = $this->getArray($this->ppn); $record_nice = $this->getArrayNice($record_raw); $keys_nice = $this->getKeysBibTex(); if (substr($record_nice['type'], 0, 2) == "Aa") { //Type $res .= "@book {"; //create identifier $res .= $this->convOutput($record_raw,"","",'003@','x0',""); $res .= $this->convOutput($record_raw,"","",'011@','a',",\n"); //Author et al. $i = array('author', 'editor', 'title', 'series', 'address', 'publisher', 'edition', 'year', 'isbn10', 'isbn13'); foreach ($i as $j) { $res .= $this->convOutputNice($record_nice,$keys_nice,$j," = {","},\n"); } //Call Number $res .= $this->convOutput($record_raw," note"," = {","209A/01",'a',"}"); } $res .= "\n}"; $res = urlencode($res); global $bibsonomy_url; $res = $bibsonomy_url.$res; return $res; } /** public -- return BibTex record from pica data */ //used by unapi function getBibTex() { if ($this->ppn == 0) return ""; $record_raw = $this->getArray($this->ppn); $record_nice = $this->getArrayNice($record_raw); $keys_nice = $this->getKeysBibTex(); if (substr($record_nice['type'], 0, 2) == "Aa") { //Type $res .= "@book {"; //create identifier $res .= $this->convOutput($record_raw,"","",'003@','x0',""); $res .= $this->convOutput($record_raw,"","",'011@','a',",\n"); //Author et al. $i = array('author', 'editor', 'title', 'series', 'address', 'publisher', 'edition', 'year', 'isbn10', 'isbn13'); foreach ($i as $j) { $res .= $this->convOutputNice($record_nice,$keys_nice,$j," = {","},\n"); } //Call Number $res .= $this->convOutput($record_raw," note"," = {","209A/01",'a',"}"); } $res .= "\n}"; return $res; } /** private -- get data via pica xml interface */ function getData($ppn) { $ch = curl_init("$this->url"); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_COOKIE, session_name().'='.session_id() ); //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1 ); curl_setopt($ch, CURLOPT_HEADER, 0); $res = curl_exec($ch); curl_close($ch); return $res; } /** public -- return simple dublin core record data from pica record */ function getDublinCore() { $res = $this->getData($this->ppn); $res = $this->prec->getDublinCore($res); return $res; } /** public -- return dublin core rdf data from pica record */ function getDublinCoreRDF() { $res = $this->getData($this->ppn); $res = $this->prec->getXmlData($res); //parses dublin core if (empty($res)) return ""; $res = "<?xml version=\"1.0\"?>\n"; $res .= "<!DOCTYPE rdf:RDF PUBLIC "; $res .= "\"-//DUBLIN CORE//DCMES DTD 2002/07/31//EN\"\n"; $res .= "\"http://dublincore.org/documents/2002/07/31/"; $res .= "dcmes-xml/dcmes-xml-dtd.dtd\">\n"; $res .= "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n"; $res .= "<rdf:Description rdf:about=\"" .$this->myself."?ppn=$ppn&format=rdf"."\">\n"; $res .= "<dc:contributor>".$this->prec->contributor."</dc:contributor>\n"; $res .= "<dc:coverage>".$this->prec->coverage."</dc:coverage>\n"; $res .= "<dc:creator>".$this->prec->creator."</dc:creator>\n"; $res .= "<dc:date>".$this->prec->date."</dc:date>\n"; $res .= "<dc:description>".$this->prec->description."</dc:description>\n"; $res .= "<dc:format>".$this->prec->format."</dc:format>\n"; $res .= "<dc:identifier>".$this->prec->identifier."</dc:identifier>\n"; $res .= "<dc:language>".$this->prec->language."</dc:language>\n"; $res .= "<dc:publisher>".$this->prec->publisher."</dc:publisher>\n"; $res .= "<dc:related>".$this->prec->related."</dc:related>\n"; $res .= "<dc:rights>".$this->prec->rights."</dc:rights>\n"; $res .= "<dc:source>".$this->prec->source."</dc:source>\n"; $res .= "<dc:subject>".$this->prec->subject."</dc:subject>\n"; $res .= "<dc:title>".$this->prec->title."</dc:title>\n"; $res .= "<dc:type>".$this->prec->type."</dc:type>\n"; $res .= "</rdf:Description>\n"; $res .= "</rdf:RDF>\n"; return $res; } /** public -- return array with key names for BibTex*/ function getKeysBibTex() { //Type $res['type'] = 'Art'; //Author $res['author'] = ' author'; //Editor $res['editor'] = ' editor'; //Title $res['title'] = ' title'; //Series $res['series'] = ' series'; //Address, especially city $res['address'] = ' address'; //Publisher $res['publisher'] = ' publisher'; //Edition $res['edition'] = ' edition'; //Year $res['year'] = ' year'; //ISBNs $res['isbn10'] = ' isbn'; $res['isbn13'] = ' isbn'; //PPN $res['ppn'] = ' note'; return $res; } /** public -- return array with key names for text*/ function getKeysText() { //Type $res['type'] = 'Art'; //Author $res['author'] = 'Autor'; //Editor $res['editor'] = 'Herausgeber'; //Title $res['title'] = 'Titel'; //Series $res['series'] = 'Schriftenreihe'; //Address, especially city $res['address'] = 'Ort'; //Publisher $res['publisher'] = 'Verlag'; //Edition $res['edition'] = 'Auflage'; //Year $res['year'] = 'Jahr'; //ISBNs $res['isbn10'] = 'ISBN-10'; $res['isbn13'] = 'ISBN-13'; //PPN $res['ppn'] = 'PPN'; return $res; } /** public -- return formated pica plus record */ function getPicaPlus() { if ($this->ppn == 0) return ""; $res = $this->getData($this->ppn); $res = $this->prec->getPicaPlus($res); $head = "<?xml version='1.0' encoding='UTF-8'?>\n"; $head .= "<record url=\"$this->url\">\n"; $tail = "</record>\n"; return $head.$res.$tail; } /** public -- return formated plain record */ function getPlain() { if ($this->ppn == 0) return ""; $res = $this->getData($this->ppn); $res = $this->prec->getXmlData($res); return $res; } /** public -- return simple text record from pica data */ //used by unapi function getText() { if ($this->ppn == 0) return ""; $record_raw = $this->getArray($this->ppn); $record_nice = $this->getArrayNice($record_raw); $keys_nice = $this->getKeysText(); if (substr($record_nice['type'], 0, 2) == "Aa") { //Type $res .= "Art:\t\tMonographie\n"; //Author $res .= $this->convOutputNice($record_nice,$keys_nice,"author",":\t\t","\n"); //Editor $res .= $this->convOutputNice($record_nice,$keys_nice,"editor",":\t","\n"); //Title $res .= $this->convOutputNice($record_nice,$keys_nice,"title",":\t\t","\n"); //Series $res .= $this->convOutputNice($record_nice,$keys_nice,"series",":\t","\n"); //Address, especially city $res .= $this->convOutputNice($record_nice,$keys_nice,"address",":\t\t","\n"); //Publisher $res .= $this->convOutputNice($record_nice,$keys_nice,"publisher",":\t\t","\n"); //Edition $res .= $this->convOutputNice($record_nice,$keys_nice,"edition",":\t","\n"); //Year $res .= $this->convOutputNice($record_nice,$keys_nice,"year",":\t\t","\n"); //ISBNs $res .= $this->convOutputNice($record_nice,$keys_nice,"isbn10",":\t","\n"); $res .= $this->convOutputNice($record_nice,$keys_nice,"isbn13",":\t","\n"); //Call Number $i = 1; $j = 0; while ( $i <= 99 ) { if (($i <= 9) && ($j == 0)) { $j = "0".$i; } elseif (($i > 9) && ($j == 0)) { $j = $i; } $res .= $this->convOutput($record_raw,"Signatur",":\t","209A/$j",'a',"\n"); $i++; if ($i <= 9 ) { $j = "0".$i; } else { $j = $i; } if (empty($record_raw["209A/$j"]['a'])) break; } $res .= $this->convOutputNice($record_nice,$keys_nice,"ppn",":\t\t","\n"); } return $res; } /** public -- return xml formated pica record */ function getXmlData() { if ($this->ppn == 0) return ""; $res = $this->getData($this->ppn); $res = $this->prec->getXmlData($res); $head = "<?xml version='1.0' ?>\n"; //$head .= "<record>\n"; //$head .= "<record url=\"$this->opac\">\n"; //$head .= "<record url=\"$this->url\">\n"; //$head .= "<record url=\"".htmlspecialchars($this->url)."\">\n"; //$head .= "<record url=\"".$this->opac.$this->ppn."\">\n"; $head .= "<record url=\"".htmlentities($this->url)."\">\n"; $tail = "</record>\n"; return $head.$res.$tail; } //public function setOpac($opac) { $this->opac = $opac; } //public -- set ppn, the unapi identifier function setPpn($ppn) { $this->ppn = $ppn; $this->url = $this->opac.$ppn."&PLAIN=ON"; $this->myself = $_SERVER['PHP_SELF']; } } //end class Picappn /* Return result or 404 */ function final_result($res, $content_type) { if (!empty($res)) { header("Content-type: $content_type"); echo $res; } else { header('HTTP/1.0 404 Not Found'); } } ?>