Extraction de notices BNF

Cette page est une maquette d'application web capable de récupérer une notice bibliographique de la BNF et de la transformer pour lui donner la forme d'une référence bibliographique, aussi proche que possible de la norme ISO 690 (aussi connue sous la référence AFNOR Z44-005).

La page "Récupération des notices bibliographiques de la BnF en Dublin Core (OAI-PMH)" de la BNF explique que celle-ci "met à disposition sur l'entrepôt OAI-CAT l’ensemble des notices bibliographiques de BnF catalogue général" (soit plus de 12 millions de notices) dans deux formats de métadonnées dont le Dublin core simple et que "ces notices sont récupérables via le protocole OAI-PMH" (Open Archive Initiative - Protocol for Metadata Harvesting"). Elle donne l'URL de base de l'entrepôt OAI-CAT: http://catoai.bnf.fr/oai2/OAIHandler.

Le problème posé pourra donc être résolu en interrogeant l'entrepôt pour en extraire la notice souhaitée puis en traitant cette dernière pour la mettre en forme. Un script php est envisagé à cet effet.

Le document "Présentation de l’OAI-PMH : historique, objectifs, règles de fonctionnement" de la BNF précise que le protocole OAI-PMH fournit 6 requêtes pour interroger le serveur hébergeant l'entrepôt ; chacune de ces requêtes accepte un certain nombre de paramètres. Les requêtes avec leurs paramètres sont présentées par la table suivante (respecter la casse).

Requête (=verbe)
Paramètres
Identify
Pas de paramètre
ListIdentifiers
metadataPrefix (obligatoire)
from (optionnel)
until (optionnel)
set (optionnel)
resumptionToken (exclusif des autres)
ListMetadataFormats
identifier (optionnel)
ListSets
resumptionToken (paramètre unique)
ListRecords
metadataPrefix (obligatoire)
from (optionnel)
until (optionnel)
set (optionnel)
resumptionToken (exclusif des autres)
GetRecord
identifier (obligatoire)
metadataPrefix (obligatoire)

Le serveur répond par des données codées en XML. C'est tout simple… Par exemple, l'interrogation par le lien http://catoai.bnf.fr/oai2/OAIHandler?verb=Identify fournit en XML (incorporant du dc) la notice de l'entrepôt OAI-PMH numéro 1 de la Bibliothèque nationale de France (nouvelle page du navigateur). La requête http://catoai.bnf.fr/oai2/OAIHandler?verb=ListSets (sans paramètre ici) fournit la liste des ensembles (sets) structurant le catalogue - ATTENTION, le résultat de cette requête donne pour chaque <set> un enfant <setSpec> et un enfant <setName>; la valeur à utiliser comme paramètre set dans une autre requête pour spécifier l'ensemble est celle du champ setSpec (et non celle du setName). Ainsi, la requête http://catoai.bnf.fr/oai2/OAIHandler?verb=ListRecords&metadataPrefix=oai_dc&set=catalogue:cartes fournit toutes les notices des cartes en dublin core.

Pour avoir la notice d'un document, il faut faire une requête GetRecord en passant en paramètre son identifiant. Celui-ci est fourni par une recherche directement dans le champ de recherche simple de la page d'accueil de la BNF :
champ de recherche simple BNF.

Par exemple, la recherche La Crète du roi Minos protohistoire égéenne sur le site de la BNF fait sortir une référence du catalogue général, accompagnée de l'identifiant sous la forme http://catalogue.bnf.fr/ark:/12148/cb413083435 :
résultats BNF.

Il faut omettre "http://" pour obtenir l'identifiant à fournir à la requête GetRecord. Ainsi, la requête http://catoai.bnf.fr/oai2/OAIHandler?verb=GetRecord&metadataPrefix=oai_dc&identifier=catalogue.bnf.fr/ark:/12148/cb413083435 affiche la notice de ce livre en XML. C'est donc le numéro ARK qui sert de clé unique pour caractériser le document.

Cet identifiant joue un autre rôle important car, dans ses conditions d'utilisation, la BNF met deux conditions à l'utilisation de ses données :

Conditions d’utilisation
La BnF a, depuis le 1er janvier 2014, placé ses métadonnées descriptives (données bibliographiques et d'autorité) sous la « Licence Ouverte / Open Licence » de l'État élaborée par la mission Etalab. L’utilisation de ces métadonnées est libre et gratuite sous réserve du maintien de la mention de leur source et de l’indication de leur date de récupération.
Dans les notices récupérées depuis les entrepôts OAI de la BnF, vous devez conserver :
* le numéro ARK contenu dans la balise <identifier> du header de chaque « record » (ex. : <identifier>oai:bnf.fr:gallica/ark:/12148/cb30000001q</identifier>) ;
* la date contenue dans la balise <responseDate> de chaque « record » (ex. : <responseDate>2013-12-19T13:59:03Z</responseDate>).

PHP

Évidemment, php sait effectuer une requête http et récupérer la réponse dans une variable. Ceci peut se faire de plusieurs façons ; la plus simple suffit ici : elle consiste à utiliser file_gets_contents avec l'URL idoine en guise de pseudo fichier [soit, en gros, pour l'exemple vu plus haut :
$noticeBNF = file_get_contents('http://catoai.bnf.fr/oai2/OAIHandler?verb=GetRecord&metadataPrefix=oai_dc&identifier=catalogue.bnf.fr/ark:/12148/cb413083435')].

Pour produire la référence bibliographique à partir d'une notice issue d'une recherche BNF, entrer son identifiant ark dans le champ suivant et cliquer sur le bouton.

== Début de sortie php ==

Identifiant ARK : (100 car.max)

Notice brute

Le serveur BNF vient de renvoyer la réponse à la requête sous la forme de la chaîne de caractères suivante :

<?xml version="1.0" encoding="UTF-8" ?><OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"><responseDate>2018-10-24T01:34:57Z</responseDate><request verb="GetRecord" metadataPrefix="oai_dc" identifier="catalogue.bnf.fr/ark:/12148/cb413083435">http://catoai.bnf.fr/oai2/OAIHandler</request><GetRecord><record><header><identifier>oai:bnf.fr:catalogue/ark:/12148/cb413083435</identifier><datestamp>2012-09-11</datestamp><setSpec>catalogue:collections:d1</setSpec><setSpec>catalogue:edition:livres</setSpec><setSpec>catalogue:imprimes:monographies</setSpec></header><metadata><oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd"> <dc:identifier>http://catalogue.bnf.fr/ark:/12148/cb413083435</dc:identifier> <dc:title>La Crète du roi Minos : une brillante civilisation de la Protohistoire égéenne / Nicole Fernandez</dc:title> <dc:creator>Fernandez, Nicole (1953-....)</dc:creator> <dc:publisher>l'Harmattan (Paris)</dc:publisher> <dc:date>2008</dc:date> <dc:subject xml:lang="fre">Minoens</dc:subject> <dc:identifier>ISBN 9782296059795</dc:identifier> <dc:description>Code à barres commercial : EAN 9782296059795</dc:description> <dc:format>1 vol. (207 p.) : ill., couv. ill. en coul. ; 22 cm</dc:format> <dc:language>fre</dc:language> <dc:type xml:lang="fre">texte imprimé</dc:type> <dc:type xml:lang="eng">printed text</dc:type> <dc:type xml:lang="eng">text</dc:type> <dc:rights xml:lang="fre">Catalogue en ligne de la Bibliothèque nationale de France</dc:rights> <dc:rights xml:lang="eng">French National Library online Catalog</dc:rights> </oai_dc:dc></metadata></record></GetRecord></OAI-PMH>

L'examen de cette chaîne révèle la structure Dublin Core embarquée dans la structure oai de cette sortie. Il ne reste plus qu'à la mettre en forme. Le début du contenu récupéré dans la variable php (<!--?xml version="1.0" encoding="UTF-8" ?-->) le spécifie bien comme du XML. La première idée qui vient est de traiter la chaîne avec des expressions rationnelles mais cette approche est lourde et peu lisible. En fait, il existe un langage de programmation puissant spécialement adapté à ce type de traitement, XSLT, et PHP l'implémente, depuis PHP 5, sous la forme d'une fonction XSLTProcessor qui prend en entrée le XML initial, lui applique un programme écrit en XSLT (par exemple fourni dans un fichier ad hoc) et fournit en sortie une nouvelle chaîne XML (qui peut être du HTML ou du texte par exemple).

Télécharger un fichier contenant la réponse BNF (XML).

Transformation

Application de XSLTProcessor

Le code PHP effectuant la transformation est très court - essentiellement 6 instructions pour mettre en place les éléments nécessaires et une instruction pour lancer le programme, plus un peu de gestion d'erreur :

$styleMonographie = new DOMDocument() ;   // Création d'un objet document DOM pour recevoir le programme XSLT adapté aux monographies
$monographieChargementOK = $styleMonographie->load('monographie.xsl') ; // Chargement dans le document DOM du fichier programme (méthode "load")
// La variable $monographieChargementOK contient TRUE si le chargement a réussi et FALSE sinon.

$xmlBNF = new DOMDocument() ;             // Création d'un document DOM pour recevoir la réponse XML à la requête BNF
$xmlBNF->loadXML($noticeBNF) ;            // Chargement dans le document DOM du contenu de la chaîne BNF (méthode "loadXML")

$monographieProcessor = new XSLTProcessor() ;                                           // Création d'un transformateur pour les monographies...
$importationStyleMonoOK = $monographieProcessor->importStylesheet($styleMonographie) ;  // ... et chargement dedans du programme XSLT idoine
// La variable $importationStyleMonoOK contient TRUE si le chargement a réussi et FALSE sinon.

echo "<h3>Résultat de la transformation par XSLTProcessor</h3>" ;

if ($importationStyleMonoOK)    // Si le chargement du programme XSLT a réussi
        {
        echo "<p>Le processeur a acquis le style et produit le résultat suivant :</p>" ;
        $refMonographie = $monographieProcessor->transformToXML($xmlBNF);    // Soumission du document DOM "BNF" au transformateur
        echo '<p class="cite">'.$refMonographie."</p>\n" ;  // $refMonographie contient la référence mise en forme
        }
else                           // sinon
        {
        echo "<p>Le processeur ne comprend pas le style</p>" ;
        }

Ainsi, l'utilisateur ne doit se soucier que de la rédaction du programme XSLT de mise en forme alias feuille de style (monographie.xsl dans cet exemple).

Résultat de la transformation par XSLTProcessor

Le processeur a acquis le style et produit le résultat suivant :

Fernandez, Nicole (1953-....). 2008. La Crète du roi Minos : une brillante civilisation de la Protohistoire égéenne / Nicole Fernandez. l'Harmattan (Paris). 1 vol. (207 p.) : ill., couv. ill. en coul. ; 22 cm. ISBN 9782296059795. Notice oai:bnf.fr:catalogue/ark:/12148/cb413083435 (consultation : 2018-10-24T01:34:57Z).

== Fin de sortie php ==

Cette page ne présente qu'une esquisse de traitement. Il est loisible de noter deux curiosités dans l'emploi du dc dans le cas de l'exemple d'ouvrage initial (valeur par défaut du n° ARK dans le formulaire) : dates dans le champ "dc:creator", nom de l'auteur répété à la fin du champ "dc:title". D'une manière plus générale, des écarts au dc se manifestent et ceci réduit la compatibilité des notices BNF accessibles dans le cadre du projet OAI-PMH avec la norme ISO 690 relatives aux références bibliographiques. La BNF explique en effet, à la fin de sa page sur le Dublin Core, que "les notices en Dublin Core des deux entrepôts OAI ne sont pas créées manuellement, mais dérivées de notices ou de bases de données existantes. Les données ne sont donc pas nativement formatées en Dublin Core". Du coup, pour obtenir une référence à la norme ISO 690, il faudra retoucher un peu le résultat manuellement, en conservant le numéro ARK et la date de consultation pour respecter les conditions d'utilisation.


Transformation par PHP+XSLT d'une notice BNF en référence bibliographique - Version 0.2.


logo html 5  Validé avec le vérificateur expérimental du W3C