{ "translatorID": "f349954c-9957-4b5f-be24-1a8bb52f7fbd", "label": "BnF ISBN", "creator": "Abe Jellinek", "target": "", "minVersion": "4.0", "maxVersion": "", "priority": 98, "inRepository": true, "translatorType": 8, "browserSupport": "gcsibv", "lastUpdated": "2021-07-30 21:23:00" } /* ***** BEGIN LICENSE BLOCK ***** Copyright © 2021 Abe Jellinek This file is part of Zotero. Zotero is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Zotero 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Zotero. If not, see . ***** END LICENSE BLOCK ***** */ let ns = { srw: 'http://www.loc.gov/zing/srw/', mxc: 'info:lc/xmlns/marcxchange-v2' }; function detectSearch(item) { return !!item.ISBN; } function doSearch(item) { let ISBN = ZU.cleanISBN(item.ISBN); let url = `https://catalogue.bnf.fr/api/SRU?version=1.2&operation=searchRetrieve&query=bib.isbn%20all%20%22${ISBN}%22`; ZU.doGet(url, function (xmlText) { let parser = new DOMParser(); let xml = parser.parseFromString(xmlText, 'application/xml'); let records = ZU.xpath(xml.documentElement, '/srw:searchRetrieveResponse/srw:records/srw:record', ns); if (!records) return; for (let record of records) { if (ZU.xpathText(record, '//srw:recordSchema', ns) != 'marcxchange') continue; let marcRecords = ZU.xpath(record, '//srw:recordData/mxc:record', ns); if (!marcRecords) continue; for (let marcRecord of marcRecords) { marcRecord.setAttribute('xmlns:marc', 'http://www.loc.gov/MARC21/slim'); // Here we convert the XML we get from BnF from the original // MarcXchange format into MARCXML by search-and-replacing // the namespace. MARCXML and and MarcXchange are essentially // the same format: the latter is a "generalization (mainly by // weakening restrictions)" of the former. We didn't enforce // those restrictions to begin with. // MarcXchange spec: // https://www.loc.gov/standards/iso25577/ISO_DIS_25577__E_.pdf let marcxchangeText = new XMLSerializer().serializeToString(marcRecord); let marcXMLText = marcxchangeText.replace(/