First draft
This commit is contained in:
71
src/OAI/OaiBase.php
Normal file
71
src/OAI/OaiBase.php
Normal file
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\OAI;
|
||||
|
||||
use \DOMDocument;
|
||||
|
||||
use function Symfony\Component\String\b;
|
||||
|
||||
/**
|
||||
* Creates the base XML document containing dynamically generated responses
|
||||
* @todo different create functions depending on request type? e.g. GetRecord
|
||||
*/
|
||||
final class OaiBase
|
||||
{
|
||||
/**
|
||||
* @param string $content The dynamically generated XML response
|
||||
* @param string $nodeName The root node name to be imported
|
||||
*/
|
||||
public static function create(string $content, string $nodeName, string $metadataFormat = 'oai_dc'): string
|
||||
{
|
||||
$main = new DOMDocument(encoding: 'UTF-8');
|
||||
$main->formatOutput = true;
|
||||
$xslt = $main->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="/xslt/oai2.xsl"');
|
||||
$main->appendChild($xslt);
|
||||
|
||||
$imported = new DOMDocument(encoding: 'UTF-8');
|
||||
$imported->loadXML(b($content)->toUnicodeString()->toString(), LIBXML_NOWARNING);
|
||||
$node = $imported->getElementsByTagName($nodeName)->item(0);
|
||||
|
||||
$root = $main->createElement('OAI-PMH');
|
||||
$root->setAttribute('xmlns', 'http://www.openarchives.org/OAI/2.0/');
|
||||
$root->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
|
||||
$root->setAttribute('xsi:schemaLocation', 'http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd');
|
||||
$responseDate = $main->createElement('responseDate', date("Y-m-d\TH:i:s\Z"));
|
||||
$root->appendChild($responseDate);
|
||||
$request = $main->createElement('request', 'https://www.yourdomain.com/oai');
|
||||
|
||||
if ($nodeName !== 'error') {
|
||||
$request->setAttribute('verb', $nodeName);
|
||||
// TODO dynamic metadata prefix!
|
||||
$request->setAttribute('metadataPrefix', $metadataFormat);
|
||||
}
|
||||
|
||||
$root->appendChild($request);
|
||||
$main->appendChild($root);
|
||||
$node = $main->importNode($node, true);
|
||||
$root->appendChild($node);
|
||||
|
||||
// To avoid error when importing XML from RecordOaiDatacite... (why??)
|
||||
if ($metadataFormat === 'oai_datacite') {
|
||||
$oai_datacite = $main->getElementsByTagName('oai_datacite')->item(0);
|
||||
$resource = $main->getElementsByTagName('resource')->item(0);
|
||||
$xmlns = $main->createAttribute('xmlns');
|
||||
$xsi = $main->createAttribute('xsi:schemaLocation');
|
||||
$xmlnsRes = $main->createAttribute('xmlns');
|
||||
$xsiRes = $main->createAttribute('xsi:schemaLocation');
|
||||
$xsi->value = "http://schema.datacite.org/oai/oai-1.1/ http://schema.datacite.org/oai/oai-1.1/oai.xsd";
|
||||
$xmlns->value = "http://schema.datacite.org/oai/oai-1.1/";
|
||||
$oai_datacite->appendChild($xmlns);
|
||||
$oai_datacite->appendChild($xsi);
|
||||
$xmlnsRes->value = "http://datacite.org/schema/kernel-3";
|
||||
$xsiRes->value = "http://datacite.org/schema/kernel-3 http://schema.datacite.org/meta/kernel-3/metadata.xsd";
|
||||
$resource->appendChild($xmlnsRes);
|
||||
$resource->appendChild($xsiRes);
|
||||
}
|
||||
|
||||
return $main->saveXML();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user