fixes for MarcXchange XML writing

This commit is contained in:
Jörg Prante 2022-12-02 17:05:52 +01:00
parent 216031848e
commit dfefc49fee
15 changed files with 193 additions and 163 deletions

View file

@ -1,5 +1,5 @@
group = org.xbib
name = marc
version = 2.9.8
version = 2.9.9
org.gradle.warning.mode = ALL

View file

@ -18,7 +18,7 @@ package org.xbib.marc;
public class LightweightMarcRecordAdapter extends MarcRecordAdapter {
public LightweightMarcRecordAdapter(MarcRecordListener marcRecordListener) {
super(marcRecordListener, false);
super(marcRecordListener, null);
this.builder = Marc.builder().lightweightRecord();
}

View file

@ -52,6 +52,7 @@ import java.io.UncheckedIOException;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
@ -664,7 +665,7 @@ public final class Marc {
private boolean isLightweightRecord;
private boolean isStableFieldOrder;
private Comparator<String> comparator;
private Pattern keyPattern;
@ -1131,8 +1132,8 @@ public final class Marc {
return this;
}
public Marc.Builder stableFieldOrder() {
this.isStableFieldOrder = true;
public Marc.Builder comparator(Comparator<String> comparator) {
this.comparator = comparator;
return this;
}
@ -1141,7 +1142,7 @@ public final class Marc {
* @return MARC record
*/
public MarcRecord buildRecord() {
return new MarcRecord(format, type, recordLabel, marcFieldList, isLightweightRecord, isStableFieldOrder);
return new MarcRecord(format, type, recordLabel, marcFieldList, isLightweightRecord, comparator);
}
/**

View file

@ -23,6 +23,7 @@ import org.xbib.marc.label.RecordLabel;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
@ -63,13 +64,14 @@ public class MarcRecord implements Map<String, Object> {
* @param recordLabel the record label
* @param marcFields the MARC field
* @param lightweight true if MARC record fields should not be entered into the underlying hash map.
* @param comparator a tag comparator for the underlying map
*/
public MarcRecord(String format,
String type,
RecordLabel recordLabel,
List<MarcField> marcFields,
boolean lightweight,
boolean stable) {
Comparator<String> comparator) {
this.format = format;
this.type = type;
this.recordLabel = recordLabel;
@ -77,7 +79,7 @@ public class MarcRecord implements Map<String, Object> {
throw new NullPointerException("record label must not be null");
}
this.marcFields = marcFields;
this.delegate = lightweight ? Map.of() : createMapFromMarcFields(stable);
this.delegate = lightweight ? Map.of() : createMapFromMarcFields(comparator);
}
/**
@ -371,7 +373,11 @@ public class MarcRecord implements Map<String, Object> {
}
public void rebuildMap() {
this.delegate = createMapFromMarcFields(true);
this.delegate = createMapFromMarcFields(Comparator.naturalOrder());
}
public void rebuildFields(Comparator<MarcField> comparator) {
this.marcFields.sort(comparator);
}
@Override
@ -451,8 +457,8 @@ public class MarcRecord implements Map<String, Object> {
}
@SuppressWarnings("unchecked")
private Map<String, Object> createMapFromMarcFields(boolean stable) {
Map<String, Object> map = stable ? new TreeMap<>() : new LinkedHashMap<>();
private Map<String, Object> createMapFromMarcFields(Comparator<String> comparator) {
Map<String, Object> map = comparator!= null ? new TreeMap<>(comparator) : new LinkedHashMap<>();
if (marcFields == null) {
return map;
}

View file

@ -17,6 +17,8 @@ package org.xbib.marc;
import org.xbib.marc.label.RecordLabel;
import java.util.Comparator;
/**
* The Marc record adapter collects Marc field events, collects them in a Marc builder,
* and sends collected records to a Marc record listener. This is very handy for
@ -28,15 +30,13 @@ public class MarcRecordAdapter implements MarcListener {
protected Marc.Builder builder;
private boolean isStableFieldOrder;
private Comparator<String> comparator;
public MarcRecordAdapter(MarcRecordListener marcRecordListener, boolean isStableFieldOrder) {
public MarcRecordAdapter(MarcRecordListener marcRecordListener, Comparator<String> comparator) {
this.marcRecordListener = marcRecordListener;
this.builder = Marc.builder();
this.isStableFieldOrder = isStableFieldOrder;
if (isStableFieldOrder) {
this.builder.stableFieldOrder();
}
this.comparator = comparator;
this.builder.comparator(comparator);
}
@Override
@ -64,9 +64,7 @@ public class MarcRecordAdapter implements MarcListener {
public void endRecord() {
marcRecordListener.record(builder.buildRecord());
builder = Marc.builder();
if (isStableFieldOrder) {
builder.stableFieldOrder();
}
builder.comparator(comparator);
}
@Override

View file

@ -15,6 +15,7 @@
*/
package org.xbib.marc.xml;
import java.util.Comparator;
import java.util.HashSet;
import org.xbib.marc.MarcField;
import org.xbib.marc.MarcListener;
@ -85,7 +86,7 @@ public class MarcContentHandler
private final Set<String> validNamespaces;
private boolean isStableFieldOrder;
private Comparator<String> comparator;
public MarcContentHandler() {
this.recordCounter = new AtomicInteger();
@ -166,8 +167,8 @@ public class MarcContentHandler
return this;
}
public MarcContentHandler setStableFieldOrder(boolean stableFieldOrder) {
this.isStableFieldOrder = stableFieldOrder;
public MarcContentHandler setComparator(Comparator<String> comparator) {
this.comparator = comparator;
return this;
}
@ -254,7 +255,7 @@ public class MarcContentHandler
} else {
MarcRecord marcRecord = new MarcRecord(getFormat(), getType(),
RecordLabel.builder().from(label).build(),
marcFieldList, false, isStableFieldOrder);
marcFieldList, false, comparator);
marcRecordListener.record(marcRecord);
}
}

View file

@ -343,7 +343,7 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
if (exception != null) {
return;
}
if (field.isControl() && field.getValue() != null) {
if (field.isControl()) {
Iterator<Attribute> attrs =
Collections.singletonList(eventFactory.createAttribute(TAG_ATTRIBUTE,
transform(field.getTag()))).iterator();
@ -351,6 +351,12 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
String value = field.getValue();
if (value != null && !value.isEmpty()) {
xmlEventConsumer.add(eventFactory.createCharacters(transform(value)));
} else {
// the control field is disguised as a data field, try lookup value in first subfield of " "
value = field.getFirstSubfieldValue(" ");
if (value != null && !value.isEmpty()) {
xmlEventConsumer.add(eventFactory.createCharacters(transform(value)));
}
}
xmlEventConsumer.add(eventFactory.createEndElement(CONTROLFIELD_ELEMENT, namespaces));
} else if (!field.isEmpty()) {
@ -369,9 +375,9 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
// "There is one restriction. A special mode (identifier length = 0) of ISO 2709 operates with
// data fields without subfields. In the MarcXchange schema subfields are required,
// i.e. identifier length = 0 is not supported."
// We support it! A subfield ID of length 0 will be substituted by "a"
// But we support it! A subfield ID of length 0 will be substituted by blank (" ").
if (code.isEmpty()) {
code = "a";
code = " ";
}
List<Attribute> subfieldattrs = new LinkedList<>();
subfieldattrs.add(eventFactory.createAttribute(CODE_ATTRIBUTE, transform(code)));
@ -382,9 +388,9 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
}
String value = field.getValue();
if (value != null && !value.isEmpty()) {
// if we have data in a datafield, create subfield "a" with data
// if we have data in a datafield, create subfield blank (" ") with data
attrs = new LinkedList<>();
attrs.add(eventFactory.createAttribute(CODE_ATTRIBUTE, "a"));
attrs.add(eventFactory.createAttribute(CODE_ATTRIBUTE, " "));
xmlEventConsumer.add(eventFactory.createStartElement(SUBFIELD_ELEMENT, attrs.iterator(), namespaces));
xmlEventConsumer.add(eventFactory.createCharacters(transform(value)));
xmlEventConsumer.add(eventFactory.createEndElement(SUBFIELD_ELEMENT, namespaces));
@ -444,7 +450,6 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
if (xmlEventConsumer instanceof XMLEventWriter) {
((XMLEventWriter) xmlEventConsumer).flush();
}
afterRecord();
} catch (XMLStreamException e) {
handleException(new IOException(e));
} finally {

View file

@ -131,7 +131,6 @@ public class MarcToModsTest {
}
});
transformer.transform(source, streamResult);
marcInputStream.close();
xslInputStream.close();
assertThat(out.toByteArray(),
CompareMatcher.isIdenticalTo(getClass().getResource("summerland-sax-mods.xml").openStream()));
@ -178,7 +177,6 @@ public class MarcToModsTest {
}
});
transformer.transform(source, streamResult);
marcInputStream.close();
xslInputStream.close();
assertThat(out.toByteArray(),
CompareMatcher.isIdenticalTo(getClass().getResource("summerland-dom-mods.xml").openStream()));

View file

@ -16,6 +16,7 @@
package org.xbib.marc;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import org.junit.jupiter.api.Test;
import org.xbib.marc.transformer.value.MarcValueTransformers;
@ -24,16 +25,33 @@ import org.xmlunit.matchers.CompareMatcher;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.text.Normalizer;
import java.util.Map;
import java.util.TreeMap;
import java.util.zip.GZIPInputStream;
public class MarcXchangeWriterTest {
@Test
public void simpleMarcRecordWrite() throws Exception {
Map<String, Object> map = new TreeMap<>(Map.of("001", "123",
"100", Map.of("_", Map.of("a", "Hello World"))));
MarcRecord marcRecord = MarcRecord.from(map);
StringWriter stringWriter = new StringWriter();
try (MarcXchangeWriter writer = new MarcXchangeWriter(stringWriter)) {
writer.startDocument();
writer.record(marcRecord);
writer.endDocument();
}
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?><record xmlns=\"info:lc/xmlns/marcxchange-v2\" format=\"MARC21\" xsi:schemaLocation=\"info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" type=\"Bibliographic\"><leader>00000 0000000 000 </leader><datafield ind2=\" \" ind1=\" \" tag=\"100\"><subfield code=\"a\">Hello World</subfield></datafield><controlfield tag=\"001\">123</controlfield></record>", stringWriter.toString());
}
@Test
public void splitMarcXchange() throws Exception {
String s = "IRMARC8.bin";
InputStream inputStream = getClass().getResource("/org/xbib/marc//" + s).openStream();
InputStream inputStream = getClass().getResource("/org/xbib/marc/" + s).openStream();
MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
// fileNamePattern, splitSize, bufferSize, compress, indent
@ -61,7 +79,7 @@ public class MarcXchangeWriterTest {
@Test
public void splitMarcXchangeCompressed() throws Exception {
String s = "IRMARC8.bin";
InputStream inputStream = getClass().getResource("/org/xbib/marc//" + s).openStream();
InputStream inputStream = getClass().getResource("/org/xbib/marc/" + s).openStream();
MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
// fileNamePattern, splitSize, bufferSize, compress, indent

View file

@ -43,8 +43,11 @@ import org.xml.sax.InputSource;
import org.xmlunit.matchers.CompareMatcher;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Pattern;
public class MabTest {
@ -158,6 +161,9 @@ public class MabTest {
assertNull(writer.getException());
}
sw.close();
//try (Writer writer = Files.newBufferedWriter(Paths.get("HT016424175-combined.xml"))) {
// writer.write(sw.toString());
//}
assertStream(s, new ByteArrayInputStream(outputStream.toByteArray()),
getClass().getResource("HT016424175.xml.combined.txt").openStream());
assertThat(sw.toString(),

View file

@ -39,6 +39,7 @@ import org.xbib.marc.xml.MarcContentHandler;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.text.Normalizer;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
@ -65,7 +66,7 @@ public class MarcJsonWriterTest {
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
) {
Marc.builder()
.stableFieldOrder()
.comparator(Comparator.naturalOrder())
.setInputStream(inputStream)
.setCharset(Charset.forName("ANSEL"))
.setMarcListener(writer)
@ -92,7 +93,7 @@ public class MarcJsonWriterTest {
try (MarcJsonWriter writer = new MarcJsonWriter(outputStream)
) {
Marc.builder()
.stableFieldOrder()
.comparator(Comparator.naturalOrder())
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
.setInputStream(inputStream)
@ -125,7 +126,7 @@ public class MarcJsonWriterTest {
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
.setInputStream(inputStream)
.setCharset(Charset.forName("ANSEL"))
.setMarcListener(new MarcRecordAdapter(writer, true))
.setMarcListener(new MarcRecordAdapter(writer, Comparator.naturalOrder()))
.build()
.writeCollection();
}
@ -146,7 +147,7 @@ public class MarcJsonWriterTest {
contentHandler.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd");
contentHandler.setFormat("MARC21");
contentHandler.setType("Bibliographic");
contentHandler.setMarcListener(new MarcRecordAdapter(writer, true));
contentHandler.setMarcListener(new MarcRecordAdapter(writer, Comparator.naturalOrder()));
Marc.builder()
.setInputStream(inputStream)
.setContentHandler(contentHandler)

View file

@ -1,232 +1,228 @@
<collection xmlns="info:lc/xmlns/marcxchange-v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd">
<collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<record format="MARC21" type="Bibliographic">
<leader>00860vM2.01200024 000h</leader>
<datafield tag="LDR" ind1=" " ind2=" ">
<subfield code="a">00860vM2.01200024------h</subfield>
<datafield ind2=" " ind1=" " tag="LDR">
<subfield code=" ">00860vM2.01200024------h</subfield>
</datafield>
<datafield tag="FMT" ind1=" " ind2=" ">
<subfield code="a">MH</subfield>
<datafield ind2=" " ind1=" " tag="FMT">
<subfield code=" ">MH</subfield>
</datafield>
<datafield tag="001" ind1=" " ind2="1">
<subfield code="a">HT004330420</subfield>
<controlfield tag="001"></controlfield>
<controlfield tag="002"></controlfield>
<datafield ind2=" " ind1=" " tag="030">
<subfield code=" ">a|1uc||||||17</subfield>
</datafield>
<datafield tag="002" ind1="a" ind2="1">
<subfield code="a">19921110</subfield>
<datafield ind2=" " ind1=" " tag="050">
<subfield code=" ">a|||||||||||||</subfield>
</datafield>
<datafield tag="030" ind1=" " ind2=" ">
<subfield code="a">a|1uc||||||17</subfield>
<datafield ind2=" " ind1=" " tag="051">
<subfield code=" ">s|||||||</subfield>
</datafield>
<datafield tag="050" ind1=" " ind2=" ">
<subfield code="a">a|||||||||||||</subfield>
</datafield>
<datafield tag="051" ind1=" " ind2=" ">
<subfield code="a">s|||||||</subfield>
</datafield>
<datafield tag="070" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="070">
<subfield code="a">292</subfield>
</datafield>
<datafield tag="080" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="080">
<subfield code="a">60</subfield>
</datafield>
<datafield tag="100" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="100">
<subfield code="p">Aselmeier, Ulrich</subfield>
<subfield code="9">(DE-588)108129330</subfield>
</datafield>
<datafield tag="104" ind1="a" ind2="1">
<datafield ind2="1" ind1="a" tag="104">
<subfield code="p">Vogel, Günter</subfield>
<subfield code="9">(DE-588)104707070</subfield>
</datafield>
<datafield tag="105" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="105">
<subfield code="p">Vogel, W.</subfield>
</datafield>
<datafield tag="105" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="105">
<subfield code="p">Vogel, Gunther</subfield>
</datafield>
<datafield tag="331" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="331">
<subfield code="a">Handlungshilfen zur Unterrichtsplanung</subfield>
</datafield>
<datafield tag="335" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="335">
<subfield code="a">Grundlagen und Beispiele aus sach- und schülerorientierter Sicht</subfield>
</datafield>
<datafield tag="359" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="359">
<subfield code="a">Ulrich Aselmeier ; Günter Vogel</subfield>
</datafield>
<datafield tag="410" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="410">
<subfield code="a">Rheinfelden [u.a.]</subfield>
</datafield>
<datafield tag="412" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="412">
<subfield code="a">Schäuble</subfield>
</datafield>
<datafield tag="425" ind1="a" ind2="1">
<datafield ind2="1" ind1="a" tag="425">
<subfield code="a">1992</subfield>
</datafield>
<datafield tag="433" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="433">
<subfield code="a">135 S. : graph. Darst.</subfield>
</datafield>
<datafield tag="830" ind1=" " ind2="0">
<datafield ind2="0" ind1=" " tag="830">
<subfield code="t">Gesellschaft, Erziehung und Bildung : Beiträge zu einer neuen Lernkultur ; 6</subfield>
<subfield code="w">HT003704070</subfield>
<subfield code="v">6 = 23 [d. Gesamtw.]</subfield>
<subfield code="n">6</subfield>
</datafield>
<datafield tag="830" ind1=" " ind2="0">
<datafield ind2="0" ind1=" " tag="830">
<subfield code="t">Gesellschaft, Erziehung und Bildung ; 23</subfield>
<subfield code="w">HT003575299</subfield>
<subfield code="v">23 : Beiträge zu einer neuen Lernkultur ; 6</subfield>
<subfield code="n">23</subfield>
</datafield>
<datafield tag="540" ind1="a" ind2="1">
<datafield ind2="1" ind1="a" tag="540">
<subfield code="a">3-87718-583-5</subfield>
<subfield code="b">kart. : ca. DM 48.00 (freier Pr.)</subfield>
</datafield>
<datafield tag="700" ind1="l" ind2="1">
<datafield ind2="1" ind1="l" tag="700">
<subfield code="a">120</subfield>
</datafield>
<datafield tag="689" ind1="0" ind2="0">
<datafield ind2="0" ind1="0" tag="689">
<subfield code="s">Unterrichtsplanung</subfield>
<subfield code="9">(DE-588)4117301-6</subfield>
</datafield>
<datafield tag="689" ind1="0" ind2="1">
<datafield ind2="1" ind1="0" tag="689">
<subfield code="s">Sekundarstufe</subfield>
<subfield code="9">(DE-588)4077347-4</subfield>
</datafield>
<datafield tag="SYS" ind1=" " ind2=" ">
<subfield code="a">006488301</subfield>
<datafield ind2=" " ind1=" " tag="SYS">
<subfield code=" ">006488301</subfield>
</datafield>
<datafield tag="LOW" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="LOW">
<subfield code="a">DE-Bi10</subfield>
</datafield>
<datafield tag="LOW" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="LOW">
<subfield code="a">U0001</subfield>
</datafield>
<datafield tag="LOW" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="LOW">
<subfield code="a">R0001</subfield>
</datafield>
<datafield tag="LOW" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="LOW">
<subfield code="a">B0001</subfield>
</datafield>
<datafield tag="LOW" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="LOW">
<subfield code="a">L0001</subfield>
</datafield>
<datafield tag="LOW" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="LOW">
<subfield code="a">M1054</subfield>
</datafield>
<datafield tag="LOW" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="LOW">
<subfield code="a">M0001</subfield>
</datafield>
<datafield tag="952" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="952">
<subfield code="s">Lehrplanung</subfield>
</datafield>
<datafield tag="952" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="952">
<subfield code="s">Unterricht</subfield>
<subfield code="x">Planung</subfield>
</datafield>
<datafield tag="952" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="952">
<subfield code="s">Secondary School</subfield>
</datafield>
<datafield tag="952" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="952">
<subfield code="s">Sekundarbereich</subfield>
</datafield>
<datafield tag="952" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="952">
<subfield code="s">Sekundarschule</subfield>
</datafield>
<datafield tag="952" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="952">
<subfield code="s">Schuljahr 5-13</subfield>
</datafield>
<datafield tag="952" ind1=" " ind2="1">
<datafield ind2="1" ind1=" " tag="952">
<subfield code="s">Schuljahr 5-12</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">Bi 10</subfield>
<subfield code="b">00078080</subfield>
<subfield code="c">IGX Asel</subfield>
<subfield code="e">ILL Ausleihe</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">290</subfield>
<subfield code="b">00000001</subfield>
<subfield code="c">Bg 14187</subfield>
<subfield code="e">ILL Ausleihe</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">290</subfield>
<subfield code="b">00012012</subfield>
<subfield code="c">PCA 430/67</subfield>
<subfield code="e">keine ILL</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">294</subfield>
<subfield code="b">00000014</subfield>
<subfield code="c">MVA7096</subfield>
<subfield code="e">ILL Ausleihe</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">51</subfield>
<subfield code="b">00000000</subfield>
<subfield code="c">IGX 112</subfield>
<subfield code="e">ILL Ausleihe</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">6</subfield>
<subfield code="b">00000040</subfield>
<subfield code="c">3D 90391</subfield>
<subfield code="e">ILL Ausleihe</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">6/123</subfield>
<subfield code="b">00004040</subfield>
<subfield code="c">ERZ XG2 9A</subfield>
<subfield code="e">ILL Ausleihe</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">929</subfield>
<subfield code="b">00000000</subfield>
<subfield code="c">94/3507</subfield>
<subfield code="e">ILL Ausleihe</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">708</subfield>
<subfield code="b">00</subfield>
<subfield code="c">IGX/ASE</subfield>
<subfield code="e">Normalausleihe</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">467</subfield>
<subfield code="b">63</subfield>
<subfield code="c">63TML2274</subfield>
<subfield code="e">Ausleihbar</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">467</subfield>
<subfield code="b">63</subfield>
<subfield code="c">63TML2274+1</subfield>
<subfield code="e">Ausleihbar</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">Kob 7</subfield>
<subfield code="b">FRHKO</subfield>
<subfield code="c">93/3202</subfield>
<subfield code="e">ausleihbar 4 Wo</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">Lan 1</subfield>
<subfield code="b">FRHLD</subfield>
<subfield code="c">gru 92-58</subfield>
<subfield code="e">ausleihbar 4 Wo</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">465</subfield>
<subfield code="b">E11</subfield>
<subfield code="c">IGX2455</subfield>
<subfield code="e">Ausleihbestand</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">464</subfield>
<subfield code="b">D01</subfield>
<subfield code="c">IGX2112_d</subfield>
<subfield code="e">Ausleihbestand</subfield>
</datafield>
<datafield tag="088" ind1=" " ind2=" ">
<datafield ind2=" " ind1=" " tag="088">
<subfield code="a">1116</subfield>
<subfield code="b">X0001</subfield>
<subfield code="c">Ndk ASE</subfield>

File diff suppressed because one or more lines are too long

View file

@ -6,60 +6,60 @@
<controlfield tag="002">20171208</controlfield>
<controlfield tag="004">20171208</controlfield>
<datafield ind2=" " ind1=" " tag="020">
<subfield code="a">(FR-PaOEC)6bee255b-ar<61>OECD</subfield>
<subfield code=" ">(FR-PaOEC)6bee255b-ar<61>OECD</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="025">
<subfield code="a">6bee255b-ar</subfield>
<subfield code=" ">6bee255b-ar</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="030">
<subfield code="a">a|zuc||||||37</subfield>
<subfield code=" ">a|zuc||||||37</subfield>
</datafield>
<datafield ind2=" " ind1="b" tag="037">
<subfield code="a">ara</subfield>
<subfield code=" ">ara</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="050">
<subfield code="a">||||||||g|||||</subfield>
<subfield code=" ">||||||||g|||||</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="051">
<subfield code="a">m|||||||</subfield>
<subfield code=" ">m|||||||</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="070">
<subfield code="a">OECD</subfield>
<subfield code=" ">OECD</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="070">
<subfield code="a">HBZ</subfield>
<subfield code=" ">HBZ</subfield>
</datafield>
<datafield ind2=" " ind1="e" tag="078">
<subfield code="a">ZDB-164-UNL</subfield>
<subfield code="a">ZDB-164-UNL-ebook</subfield>
</datafield>
<datafield ind2=" " ind1="b" tag="200">
<subfield code="a">OHCHR</subfield>
<subfield code=" ">OHCHR</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="331"></datafield>
<datafield ind2=" " ind1=" " tag="334">
<subfield code="a">Elektronische Ressource</subfield>
<subfield code=" ">Elektronische Ressource</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="359">
<subfield code="a">OHCHR</subfield>
<subfield code=" ">OHCHR</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="410">
<subfield code="a">New York</subfield>
<subfield code=" ">New York</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="412">
<subfield code="a">United Nations</subfield>
<subfield code=" ">United Nations</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="425">
<subfield code="a">2017</subfield>
<subfield code=" ">2017</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="433">
<subfield code="a">75 p.</subfield>
<subfield code=" ">75 p.</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="540">
<subfield code="a">ISBN 9789210579391</subfield>
<subfield code=" ">ISBN 9789210579391</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="552">
<subfield code="a">10.18356/6bee255b-ar</subfield>
<subfield code=" ">10.18356/6bee255b-ar</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="652">
<subfield code="a">Online-Ressource</subfield>
@ -80,68 +80,68 @@
<controlfield tag="002">20171208</controlfield>
<controlfield tag="004">20171208</controlfield>
<datafield ind2=" " ind1=" " tag="020">
<subfield code="a">(FR-PaOEC)6f8029f6-es<65>OECD</subfield>
<subfield code=" ">(FR-PaOEC)6f8029f6-es<65>OECD</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="025">
<subfield code="a">6f8029f6-es</subfield>
<subfield code=" ">6f8029f6-es</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="030">
<subfield code="a">a|zuc||||||37</subfield>
<subfield code=" ">a|zuc||||||37</subfield>
</datafield>
<datafield ind2=" " ind1="b" tag="037">
<subfield code="a">spa</subfield>
<subfield code=" ">spa</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="050">
<subfield code="a">||||||||g|||||</subfield>
<subfield code=" ">||||||||g|||||</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="051">
<subfield code="a">s|||||||</subfield>
<subfield code=" ">s|||||||</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="070">
<subfield code="a">OECD</subfield>
<subfield code=" ">OECD</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="070">
<subfield code="a">HBZ</subfield>
<subfield code=" ">HBZ</subfield>
</datafield>
<datafield ind2=" " ind1="e" tag="078">
<subfield code="a">ZDB-164-UNL</subfield>
<subfield code="a">ZDB-164-UNL-ebook</subfield>
</datafield>
<datafield ind2=" " ind1="b" tag="200">
<subfield code="a">ECLAC</subfield>
<subfield code=" ">ECLAC</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="331">
<subfield code="a">Pol<EFBFBD>itica Industrial Rural y Fortalecimiento de Cadenas de Valor</subfield>
<subfield code=" ">Pol<EFBFBD>itica Industrial Rural y Fortalecimiento de Cadenas de Valor</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="334">
<subfield code="a">Elektronische Ressource</subfield>
<subfield code=" ">Elektronische Ressource</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="359">
<subfield code="a">ECLAC</subfield>
<subfield code=" ">ECLAC</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="410">
<subfield code="a">New York</subfield>
<subfield code=" ">New York</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="412">
<subfield code="a">United Nations</subfield>
<subfield code=" ">United Nations</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="425">
<subfield code="a">2017</subfield>
<subfield code=" ">2017</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="433">
<subfield code="a">240 p.</subfield>
<subfield code=" ">240 p.</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="451">
<subfield code="a">ECLAC Books ; no.145</subfield>
<subfield code=" ">ECLAC Books ; no.145</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="452">
<subfield code="a">2411-9385</subfield>
<subfield code=" ">2411-9385</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="540">
<subfield code="a">ISBN 9789210585897</subfield>
<subfield code=" ">ISBN 9789210585897</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="552">
<subfield code="a">10.18356/6f8029f6-es</subfield>
<subfield code=" ">10.18356/6f8029f6-es</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="652">
<subfield code="a">Online-Ressource</subfield>
@ -157,62 +157,62 @@
<controlfield tag="002">20171208</controlfield>
<controlfield tag="004">20171208</controlfield>
<datafield ind2=" " ind1=" " tag="020">
<subfield code="a">(FR-PaOEC)c78e1213-ar<61>OECD</subfield>
<subfield code=" ">(FR-PaOEC)c78e1213-ar<61>OECD</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="025">
<subfield code="a">c78e1213-ar</subfield>
<subfield code=" ">c78e1213-ar</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="030">
<subfield code="a">a|zuc||||||37</subfield>
<subfield code=" ">a|zuc||||||37</subfield>
</datafield>
<datafield ind2=" " ind1="b" tag="037">
<subfield code="a">ara</subfield>
<subfield code=" ">ara</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="050">
<subfield code="a">||||||||g|||||</subfield>
<subfield code=" ">||||||||g|||||</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="051">
<subfield code="a">m|||||||</subfield>
<subfield code=" ">m|||||||</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="070">
<subfield code="a">OECD</subfield>
<subfield code=" ">OECD</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="070">
<subfield code="a">HBZ</subfield>
<subfield code=" ">HBZ</subfield>
</datafield>
<datafield ind2=" " ind1="e" tag="078">
<subfield code="a">ZDB-164-UNL</subfield>
<subfield code="a">ZDB-164-UNL-ebook</subfield>
</datafield>
<datafield ind2=" " ind1="b" tag="200">
<subfield code="a">DESA</subfield>
<subfield code=" ">DESA</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="331">
<subfield code="a">2017</subfield>
<subfield code=" ">2017</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="334">
<subfield code="a">Elektronische Ressource</subfield>
<subfield code=" ">Elektronische Ressource</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="359">
<subfield code="a">DESA</subfield>
<subfield code=" ">DESA</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="410">
<subfield code="a">New York</subfield>
<subfield code=" ">New York</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="412">
<subfield code="a">United Nations</subfield>
<subfield code=" ">United Nations</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="425">
<subfield code="a">2017</subfield>
<subfield code=" ">2017</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="433">
<subfield code="a">62 p.</subfield>
<subfield code=" ">62 p.</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="540">
<subfield code="a">ISBN 9789213617182</subfield>
<subfield code=" ">ISBN 9789213617182</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="552">
<subfield code="a">10.18356/c78e1213-ar</subfield>
<subfield code=" ">10.18356/c78e1213-ar</subfield>
</datafield>
<datafield ind2=" " ind1="a" tag="652">
<subfield code="a">Online-Ressource</subfield>

View file

@ -25,7 +25,7 @@
</datafield>
<datafield ind2=" " ind1=" " tag="250">
<subfield code="a">1st ed.</subfield>
<subfield code="a"> </subfield>
<subfield code=" "> </subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="260">
<subfield code="a">New York :</subfield>