fix for subfield ID length in MAB, fix for UNIMARC
This commit is contained in:
parent
ae5b85f923
commit
3fb01e1b2c
21 changed files with 722524 additions and 164 deletions
|
@ -1,6 +1,6 @@
|
|||
group = org.xbib
|
||||
name = marc
|
||||
version = 1.0.14
|
||||
version = 1.0.15
|
||||
|
||||
xbib-content.version = 1.0.7
|
||||
xbib-bibliographic-character-sets.version = 1.0.0
|
||||
|
|
|
@ -270,8 +270,16 @@ public final class Marc {
|
|||
wrapIntoCollection(new BufferedSeparatorInputStream(builder.getInputStream()));
|
||||
}
|
||||
|
||||
public void writeCollection(String type) throws IOException {
|
||||
wrapIntoCollection(type, new BufferedSeparatorInputStream(builder.getInputStream()));
|
||||
}
|
||||
|
||||
public int wrapIntoCollection(ChunkStream<byte[], BytesReference> stream) throws IOException {
|
||||
return wrapFields(stream, true);
|
||||
return wrapFields(BIBLIOGRAPHIC_TYPE, stream, true);
|
||||
}
|
||||
|
||||
public int wrapIntoCollection(String type, ChunkStream<byte[], BytesReference> stream) throws IOException {
|
||||
return wrapFields(type, stream, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -282,10 +290,10 @@ public final class Marc {
|
|||
* @return the number of chunks in the stream
|
||||
* @throws IOException if chunk reading fails
|
||||
*/
|
||||
public int wrapFields(ChunkStream<byte[], BytesReference> stream,
|
||||
public int wrapFields(String type, ChunkStream<byte[], BytesReference> stream,
|
||||
boolean withCollection) throws IOException {
|
||||
int count = 0;
|
||||
MarcListener marcListener = builder.getMarcListener();
|
||||
MarcListener marcListener = builder.getMarcListener(type);
|
||||
if (marcListener == null) {
|
||||
return count;
|
||||
}
|
||||
|
@ -705,6 +713,10 @@ public final class Marc {
|
|||
return listeners.get(BIBLIOGRAPHIC_TYPE);
|
||||
}
|
||||
|
||||
public MarcListener getMarcListener(String type) {
|
||||
return listeners.get(type);
|
||||
}
|
||||
|
||||
public Map<String, MarcListener> getMarcListeners() {
|
||||
return listeners;
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
*/
|
||||
package org.xbib.marc;
|
||||
|
||||
import org.xbib.marc.dialects.mab.MabSubfieldControl;
|
||||
import org.xbib.marc.label.RecordLabel;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
@ -33,6 +34,8 @@ public class MarcField implements Comparable<MarcField> {
|
|||
|
||||
private static final String EMPTY_STRING = "";
|
||||
|
||||
private static final String BLANK_STRING = " ";
|
||||
|
||||
private final String tag;
|
||||
|
||||
private final String indicator;
|
||||
|
@ -318,6 +321,8 @@ public class MarcField implements Comparable<MarcField> {
|
|||
|
||||
private LinkedList<String> subfieldIds;
|
||||
|
||||
private Boolean isControl;
|
||||
|
||||
Builder() {
|
||||
this.subfields = new LinkedList<>();
|
||||
this.subfieldIds = new SubfieldIds();
|
||||
|
@ -349,8 +354,10 @@ public class MarcField implements Comparable<MarcField> {
|
|||
* @return this builder
|
||||
*/
|
||||
public Builder indicator(String indicator) {
|
||||
// check if indicators are "-" (like Aleph does). Replace with blank.
|
||||
this.indicator = indicator != null ? indicator.replace('-', ' ') : null;
|
||||
if (indicator != null) {
|
||||
// check if indicators are visible replacements like "-" or "#" . Replace with blank.
|
||||
this.indicator = indicator.replace('-', ' ').replace('#', ' ');
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -399,7 +406,7 @@ public class MarcField implements Comparable<MarcField> {
|
|||
}
|
||||
|
||||
/**
|
||||
* Set (non-subfield) value.
|
||||
* Set value for control/data field.
|
||||
* @param value the value
|
||||
* @return this builder
|
||||
*/
|
||||
|
@ -409,13 +416,13 @@ public class MarcField implements Comparable<MarcField> {
|
|||
}
|
||||
|
||||
/**
|
||||
* Set subfield with ID and value.
|
||||
* Set subfield with subfield ID and value.
|
||||
* @param subfieldId the subfield ID
|
||||
* @param value the subfield value
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder subfield(String subfieldId, String value) {
|
||||
this.subfields.add(new Subfield(subfieldId, value));
|
||||
subfields.add(new Subfield(subfieldId, value));
|
||||
subfieldIds.add(subfieldId);
|
||||
return this;
|
||||
}
|
||||
|
@ -426,8 +433,7 @@ public class MarcField implements Comparable<MarcField> {
|
|||
* @return this builder
|
||||
*/
|
||||
public Builder subfield(String subfieldId) {
|
||||
this.subfields.add(new Subfield(subfieldId, null));
|
||||
subfieldIds.add(subfieldId);
|
||||
subfield(subfieldId, null);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -454,75 +460,77 @@ public class MarcField implements Comparable<MarcField> {
|
|||
}
|
||||
|
||||
/**
|
||||
* Set subfield value to the last subfield which was denoted by a subfield ID.
|
||||
* Set subfield value in the last subfield which was added.
|
||||
* @param value the subfield value
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder subfieldValue(String value) {
|
||||
Subfield subfield = this.subfields.removeLast();
|
||||
this.subfields.add(new Subfield(subfield.getId(), value));
|
||||
subfields.add(new Subfield(subfields.removeLast().getId(), value));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set subfield with help of record label information from raw data.
|
||||
* @param label the record label
|
||||
* @param raw the subfield, including ID and separator
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder subfield(RecordLabel label, String raw) {
|
||||
// subtract 1 because subfield identifier length includes US separator character
|
||||
int subfieldidlen = label.getSubfieldIdentifierLength() - 1;
|
||||
if (subfieldidlen > 0 && raw.length() >= subfieldidlen) {
|
||||
String subfieldId = raw.substring(0, subfieldidlen);
|
||||
subfields.add(new Subfield(subfieldId, raw.substring(subfieldidlen)));
|
||||
subfieldIds.add(subfieldId);
|
||||
public Builder value(RecordLabel recordLabel, String value) {
|
||||
if (value.length() > 0) {
|
||||
int len = recordLabel.getSubfieldIdentifierLength() - 1; /* minus length of US separator char */
|
||||
boolean createSubfields = len > 0 && value.length() > len;
|
||||
if (createSubfields) {
|
||||
String id = value.substring(0, len);
|
||||
String content = value.substring(len);
|
||||
subfield(id, content);
|
||||
} else {
|
||||
value(value);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder value(String format, String type, RecordLabel recordLabel, String value) {
|
||||
if (value.length() > 0) {
|
||||
int len = recordLabel.getSubfieldIdentifierLength() - 1; /* minus length of US separator char */
|
||||
// override in case of MAB, which contains a wild mixture of subfield ID lengths
|
||||
if ("MAB".equals(format) && "Titel".equals(type)) {
|
||||
len = MabSubfieldControl.getSubfieldIdLen(tag());
|
||||
}
|
||||
boolean canDeriveSubfieldId = len > 0 && value.length() > len;
|
||||
if (canDeriveSubfieldId) {
|
||||
String id = value.substring(0, len);
|
||||
String content = value.substring(len);
|
||||
subfield(id, content);
|
||||
} else {
|
||||
subfield(BLANK_STRING, value);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set synthetic subfield with help of record label information from raw data.
|
||||
* If the len of the subfield ID is zero or undefined, the dummy subfield ID is used.
|
||||
* @param label the record label
|
||||
* @param dummySubfieldId the dummy subfield ID
|
||||
* @param value the subfield value
|
||||
* Set a new field with help of a record label from raw data.
|
||||
* @param format the record format
|
||||
* @param type the record type
|
||||
* @param recordLabel the record label
|
||||
* @param raw raw data (tag plus indicator plus value)
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder subfield(RecordLabel label, String dummySubfieldId, String value) {
|
||||
int len = label.getSubfieldIdentifierLength() - 1;
|
||||
if (len <= 0) {
|
||||
subfields.add(new Subfield(dummySubfieldId, value));
|
||||
subfieldIds.add(dummySubfieldId);
|
||||
} else if (value.length() >= len) {
|
||||
String id = value.substring(0, len);
|
||||
subfields.add(new Subfield(id, value.substring(len)));
|
||||
subfieldIds.add(id);
|
||||
public Builder field(String format, String type, RecordLabel recordLabel, String raw) {
|
||||
if (raw.length() >= 3) {
|
||||
tag(raw.substring(0, 3));
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a new data field with help of a record label from raw data.
|
||||
* @param label the record label
|
||||
* @param raw raw data
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder field(RecordLabel label, String raw) {
|
||||
this.tag = raw.length() > 2 ? raw.substring(0, 3) : null;
|
||||
if (isControl()) {
|
||||
if (raw.length() > 3) {
|
||||
value(raw.substring(3));
|
||||
}
|
||||
} else {
|
||||
int pos = 3 + label.getIndicatorLength();
|
||||
this.indicator = raw.length() >= pos ? raw.substring(3, pos) : null;
|
||||
int subfieldidlen = label.getSubfieldIdentifierLength();
|
||||
int pos = 3 + recordLabel.getIndicatorLength();
|
||||
if (raw.length() >= pos) {
|
||||
indicator(raw.substring(3, pos));
|
||||
value(format, type, recordLabel, raw.substring(pos));
|
||||
}
|
||||
/*int subfieldidlen = label.getSubfieldIdentifierLength();
|
||||
if (raw.length() >= pos + subfieldidlen) {
|
||||
String subfieldId = raw.substring(pos, pos + subfieldidlen);
|
||||
this.subfields.add(new Subfield(subfieldId, raw.substring(pos + subfieldidlen)));
|
||||
subfieldIds.add(subfieldId);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
@ -545,12 +553,20 @@ public class MarcField implements Comparable<MarcField> {
|
|||
return this;
|
||||
}
|
||||
|
||||
public Builder setControl(boolean isControl) {
|
||||
this.isControl = isControl;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the MARC field a control field?
|
||||
* @return true if control field, false if not
|
||||
*/
|
||||
public boolean isControl() {
|
||||
return tag != null && tag.charAt(0) == '0' && tag.charAt(1) == '0';
|
||||
if (isControl == null) {
|
||||
this.isControl = tag != null && tag.charAt(0) == '0' && tag.charAt(1) == '0';
|
||||
}
|
||||
return isControl;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -574,8 +590,11 @@ public class MarcField implements Comparable<MarcField> {
|
|||
* @return the built MARC field.
|
||||
*/
|
||||
public MarcField build() {
|
||||
if (isControl == null) {
|
||||
this.isControl = tag != null && tag.charAt(0) == '0' && tag.charAt(1) == '0';
|
||||
}
|
||||
return new MarcField(tag, indicator, position, length,
|
||||
value, subfields, subfieldIds.toString(), isControl());
|
||||
value, subfields, subfieldIds.toString(), isControl);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -40,8 +40,6 @@ import java.util.List;
|
|||
*/
|
||||
public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Closeable {
|
||||
|
||||
private static final String EMPTY = " ";
|
||||
|
||||
private String format;
|
||||
|
||||
private String type;
|
||||
|
@ -153,22 +151,19 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Clo
|
|||
emitMarcField();
|
||||
if (directory == null || directory.isEmpty()) {
|
||||
if (marcTransformer != null) {
|
||||
marcTransformer.transform(builder, recordLabel, this.data);
|
||||
marcTransformer.transform(builder, recordLabel, data);
|
||||
} else {
|
||||
builder.field(recordLabel, this.data);
|
||||
builder.field(format, type, recordLabel, data);
|
||||
}
|
||||
} else if (directory.containsKey(position)) {
|
||||
builder = directory.get(position);
|
||||
if (builder.isControl()) {
|
||||
builder.value(this.data);
|
||||
builder.value(data);
|
||||
} else {
|
||||
// we may have fields which are broken when data is longer
|
||||
// than indicator length. Then, a subfield delimiter/ID
|
||||
// is missing, and we insert a blank subfield ID plus the data here.
|
||||
int pos = recordLabel.getIndicatorLength();
|
||||
builder.indicator(this.data.substring(0, pos));
|
||||
if (pos < this.data.length()) {
|
||||
builder.subfield(recordLabel, EMPTY, this.data.substring(pos));
|
||||
builder.indicator(data.substring(0, pos));
|
||||
if (pos < data.length()) {
|
||||
builder.value(data.substring(pos));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -179,19 +174,26 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Clo
|
|||
position = position + offset;
|
||||
builder = directory.get(position);
|
||||
if (builder.isControl()) {
|
||||
builder.value(this.data);
|
||||
builder.value(data);
|
||||
} else {
|
||||
builder.indicator(this.data);
|
||||
}
|
||||
int pos = recordLabel.getIndicatorLength();
|
||||
builder.indicator(data.substring(0, pos));
|
||||
if (pos < data.length()) {
|
||||
builder.value(this.data.substring(pos));
|
||||
} }
|
||||
found = true;
|
||||
break;
|
||||
} else if (directory.containsKey(position - offset)) {
|
||||
position = position - offset;
|
||||
builder = directory.get(position);
|
||||
if (builder.isControl()) {
|
||||
builder.value(this.data);
|
||||
builder.value(data);
|
||||
} else {
|
||||
builder.indicator(this.data);
|
||||
int pos = recordLabel.getIndicatorLength();
|
||||
builder.indicator(data.substring(0, pos));
|
||||
if (pos < data.length()) {
|
||||
builder.value(data.substring(pos));
|
||||
}
|
||||
}
|
||||
found = true;
|
||||
break;
|
||||
|
@ -204,8 +206,8 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Clo
|
|||
}
|
||||
break;
|
||||
}
|
||||
case US: /* 1f */{
|
||||
builder.subfield(recordLabel, EMPTY, this.data);
|
||||
case US: /* 1f */ {
|
||||
builder.value(recordLabel, data);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
|
@ -258,10 +260,10 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Clo
|
|||
|
||||
private void newRecord() throws IOException {
|
||||
// skip line-feed (OCLC PICA quirk)
|
||||
if (this.data.charAt(0) == '\n') {
|
||||
this.data = data.substring(1);
|
||||
if (data.charAt(0) == '\n') {
|
||||
data = data.substring(1);
|
||||
}
|
||||
if (this.data.length() > RecordLabel.LENGTH) {
|
||||
if (data.length() > RecordLabel.LENGTH) {
|
||||
// record label + record content = old directory-based format
|
||||
this.recordLabel = RecordLabel.builder().from(this.data.substring(0, RecordLabel.LENGTH).toCharArray()).build();
|
||||
if (recordLabelFixer != null) {
|
||||
|
@ -274,7 +276,7 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Clo
|
|||
// create directory
|
||||
this.directory = new MarcFieldDirectory(recordLabel, this.data);
|
||||
if (directory.isEmpty()) {
|
||||
builder.field(recordLabel, this.data.substring(RecordLabel.LENGTH));
|
||||
builder.field(format, type, recordLabel, data.substring(RecordLabel.LENGTH));
|
||||
}
|
||||
} else if (this.data.length() == RecordLabel.LENGTH) {
|
||||
this.recordLabel = RecordLabel.builder().from(this.data.substring(0, RecordLabel.LENGTH).toCharArray()).build();
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
package org.xbib.marc.dialects.mab;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class MabSubfieldControl {
|
||||
|
||||
private static final Map<String, Integer> FIELDS = new HashMap<>();
|
||||
static {
|
||||
// MARC-like fields with subfield structure
|
||||
FIELDS.put("088", 2);
|
||||
FIELDS.put("655", 2);
|
||||
FIELDS.put("856", 2);
|
||||
}
|
||||
|
||||
public static Integer getSubfieldIdLen(String tag) {
|
||||
return FIELDS.getOrDefault(tag, 0);
|
||||
}
|
||||
}
|
|
@ -83,7 +83,7 @@ public class SisisInputStream extends PatternInputStream {
|
|||
this.marcGenerator = marcGenerator;
|
||||
this.bytesStreamOutput = new BytesStreamOutput();
|
||||
// this format comes without a record label, create a default one
|
||||
this.label = RecordLabel.builder().setIndicatorLength(2).setSubfieldIdentifierLength(1).build();
|
||||
this.label = RecordLabel.builder().setIndicatorLength(2).setSubfieldIdentifierLength(2).build();
|
||||
this.labelEmitted = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -16,6 +16,11 @@
|
|||
*/
|
||||
package org.xbib.marc;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.xbib.marc.io.ReplaceStringInputStream;
|
||||
import org.xbib.marc.transformer.value.MarcValueTransformers;
|
||||
|
@ -32,11 +37,6 @@ import java.text.Normalizer;
|
|||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
package org.xbib.marc;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
|
63
src/test/java/org/xbib/marc/dialects/mab/HBZTest.java
Normal file
63
src/test/java/org/xbib/marc/dialects/mab/HBZTest.java
Normal file
|
@ -0,0 +1,63 @@
|
|||
package org.xbib.marc.dialects.mab;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.xbib.marc.Marc;
|
||||
import org.xbib.marc.MarcRecord;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class HBZTest {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(HBZTest.class.getName());
|
||||
|
||||
@Test
|
||||
public void testMarcStream() throws Exception {
|
||||
String[] files = {
|
||||
"HBZ.mab"
|
||||
};
|
||||
for (String file : files) {
|
||||
AtomicInteger count = new AtomicInteger();
|
||||
try (InputStream in = getClass().getResource(file).openStream()) {
|
||||
Marc marc = Marc.builder()
|
||||
.setInputStream(in)
|
||||
.setCharset(Charset.forName("UTF-8"))
|
||||
.build();
|
||||
marc.iso2709Stream().chunks().forEach(chunk -> {
|
||||
count.incrementAndGet();
|
||||
});
|
||||
}
|
||||
assertTrue(count.get() > 0);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMarcRecordIterable() throws Exception {
|
||||
String[] files = {
|
||||
"HBZ.mab"
|
||||
};
|
||||
for (String file : files) {
|
||||
int count = 0;
|
||||
try (InputStream in = getClass().getResource(file).openStream()) {
|
||||
Marc.Builder builder = Marc.builder()
|
||||
.setFormat("MAB")
|
||||
.setType("Titel")
|
||||
.setInputStream(in)
|
||||
.setCharset(Charset.forName("x-MAB"));
|
||||
for (MarcRecord marcRecord : builder.iterable()) {
|
||||
count++;
|
||||
logger.info("record = " + marcRecord);
|
||||
}
|
||||
}
|
||||
assertEquals(1, count);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -63,19 +63,18 @@ public class MabTest {
|
|||
File file = File.createTempFile(s + ".", ".xml");
|
||||
file.deleteOnExit();
|
||||
FileOutputStream out = new FileOutputStream(file);
|
||||
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)
|
||||
try (MarcXchangeWriter writer = new MarcXchangeWriter(out, true)
|
||||
.setFormat("MAB")
|
||||
.setType("Bibliographic")) {
|
||||
.setType("Titel")
|
||||
) {
|
||||
Marc.builder()
|
||||
.setFormat("MAB")
|
||||
.setType("Titel")
|
||||
.setInputStream(in)
|
||||
.setCharset(Charset.forName("x-MAB"))
|
||||
.setFormat("MAB")
|
||||
.setType("Bibliographic")
|
||||
.setRecordLabelFixer(recordLabel ->
|
||||
RecordLabel.builder().from(recordLabel).setSubfieldIdentifierLength(0).build())
|
||||
.setMarcListener(writer)
|
||||
.setMarcListener("Titel", writer)
|
||||
.build()
|
||||
.writeCollection();
|
||||
.writeCollection("Titel");
|
||||
}
|
||||
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
package org.xbib.marc.dialects.mab;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.xbib.marc.Marc;
|
||||
import org.xbib.marc.MarcRecord;
|
||||
|
@ -9,9 +12,6 @@ import java.io.InputStream;
|
|||
import java.nio.charset.Charset;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -29,6 +29,7 @@ import java.io.File;
|
|||
import java.io.FileOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.StringWriter;
|
||||
import java.io.Writer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
|
@ -45,8 +46,8 @@ public class SisisTest extends Assert {
|
|||
public void testSisis() throws Exception {
|
||||
String s = "unloaddipl";
|
||||
InputStream in = getClass().getResource(s).openStream();
|
||||
StringWriter sw = new StringWriter();
|
||||
try (MarcXchangeWriter writer = new MarcXchangeWriter(sw)
|
||||
Writer out = new StringWriter();
|
||||
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)
|
||||
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)) {
|
||||
Marc marc = Marc.builder()
|
||||
.setInputStream(in)
|
||||
|
@ -56,7 +57,7 @@ public class SisisTest extends Assert {
|
|||
long l = marc.wrapIntoCollection(marc.sisis());
|
||||
assertEquals(36353, l);
|
||||
}
|
||||
assertThat(sw.toString(), CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
|
||||
assertThat(out.toString(), CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -46,7 +46,7 @@ public class UnimarcTest extends Assert {
|
|||
File file = File.createTempFile("periouni.", ".xml");
|
||||
file.deleteOnExit();
|
||||
FileOutputStream out = new FileOutputStream(file);
|
||||
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)
|
||||
try (MarcXchangeWriter writer = new MarcXchangeWriter(out, true)
|
||||
.setFormat("UNIMARC")
|
||||
.setType("Bibliographic")) {
|
||||
Marc.builder()
|
||||
|
|
|
@ -2,6 +2,7 @@ package org.xbib.marc.filter;
|
|||
|
||||
import org.junit.Test;
|
||||
import org.xbib.content.XContentBuilder;
|
||||
import org.xbib.content.json.JsonXContent;
|
||||
import org.xbib.marc.Marc;
|
||||
import org.xbib.marc.MarcField;
|
||||
import org.xbib.marc.MarcFieldAdapter;
|
||||
|
@ -18,8 +19,6 @@ import java.util.logging.Level;
|
|||
import java.util.logging.Logger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.xbib.content.json.JsonXContent.contentBuilder;
|
||||
|
||||
/**
|
||||
* Demo of collecting ISSNs by record identifier from a MARC file.
|
||||
*
|
||||
|
@ -79,7 +78,7 @@ public class MarcFieldFilterByRecordIdentifierTest {
|
|||
.collect(Collectors.toList());
|
||||
|
||||
// JSON output
|
||||
XContentBuilder builder = contentBuilder().prettyPrint()
|
||||
XContentBuilder builder = JsonXContent.contentBuilder().prettyPrint()
|
||||
.startObject();
|
||||
for (Map.Entry<String, Map<String, List<Map<String, String>>>> entry : result.entrySet()) {
|
||||
builder.field(entry.getKey(), entry.getValue());
|
||||
|
|
|
@ -4,13 +4,13 @@
|
|||
<leader>01794 0000445 000 </leader>
|
||||
<controlfield tag="001">000800000020003000008020004200038035001200080005001700092008008100109010001700190016002200207029002200229035001200251035001600263040001800279042000800297043003000305049000900335050002200344072001200366110004800378245024900426246002200675260008500697300004100782504005100823650004300874650004300917650004300960650004301003650004101046610005901087700002001146700002501166938005301191994001201244910002601256991006601282</controlfield>
|
||||
<datafield ind2=" " ind1=" " tag="260">
|
||||
<subfield code="a">0772</subfield>
|
||||
<subfield code=" ">0772</subfield>
|
||||
</datafield>
|
||||
<datafield ind2=" " ind1=" " tag="200">
|
||||
<subfield code="a">90311033800.0</subfield>
|
||||
<subfield code=" ">90311033800.0</subfield>
|
||||
</datafield>
|
||||
<datafield ind2=" " ind1=" " tag="051">
|
||||
<subfield code="a">028s 01609cam 22004094a 4500 </subfield>
|
||||
<subfield code=" ">028s 01609cam 22004094a 4500 </subfield>
|
||||
</datafield>
|
||||
</record>
|
||||
</collection>
|
File diff suppressed because one or more lines are too long
1
src/test/resources/org/xbib/marc/dialects/mab/HBZ.mab
Normal file
1
src/test/resources/org/xbib/marc/dialects/mab/HBZ.mab
Normal file
|
@ -0,0 +1 @@
|
|||
01268nM2.01200024 h001 HT018546928002a20150219003 20150427004 20171017025a1059839261026 DNB1059839261030 a|1uc||||||17036aCN037beng050 a|||||||||||||051 m|||||||070 468070b832080 60088 a1044b00000001c11 = TWD1002eILL Ausleihe088 a832b00002000cTWD2900eILL Ausleihe088 a461/1b205cTWX/GOReKeine Angabe088 a361b00000010cHK365=E370 G671eILL Kopie+Ausl.088 a294b00000031cWWB53734eILL Ausleihe088 a708b00cTYP/GOReNormalausleihe088 a465bE31cTWY9750+1eAusleihbestand088 a465bE31cTWY9750eAusleihbestand088 a468b69cTWX1228eausleihbar100 Gormley, Clinton102a(DE-588)1067675272104aTong, Zachary106a(DE-588)1067675701331 Elasticsearch335 the definitive guide ; [a distributed real-time search and analytics engine]359 Clinton Gormley and Zachary Tong403 1. ed.410 Beijing [u.a.]412 O'Reilly425a2015433 XXX, 690 S. : Ill., graph. Darst.540aISBN 978-1-4493-5854-9 Pb. : EUR 41.00 (DE) (freier Pr.), EUR 42.20 (AT) (freier Pr.)540aISBN 1-4493-5854-3655emX:MVBqtext/htmluhttp://deposit.d-nb.de/cgi-bin/dokserv?id=4806461&prov=M&dok_var=1&dok_ext=htm3InhaltstextA2655euhttp://digitool.hbz-nrw.de:1801/webclient/DeliveryManager?pid=7240745&custom_att_2=simple_vieweryElasticsearchxInhaltsverzeichnis
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<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">
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">02.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -97,7 +97,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">02.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -154,7 +154,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">02.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -223,7 +223,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">02.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -280,7 +280,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">02.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -358,7 +358,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -469,7 +469,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -580,7 +580,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -637,7 +637,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -718,7 +718,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -784,7 +784,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -838,7 +838,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -904,7 +904,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -970,7 +970,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1039,7 +1039,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1111,7 +1111,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1189,7 +1189,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1258,7 +1258,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1351,7 +1351,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1420,7 +1420,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1492,7 +1492,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1552,7 +1552,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1630,7 +1630,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1714,7 +1714,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1780,7 +1780,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">05.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1852,7 +1852,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">31.08.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1909,7 +1909,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">31.08.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -1969,7 +1969,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">31.08.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2041,7 +2041,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">31.08.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2128,7 +2128,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">31.08.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2209,7 +2209,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">31.08.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2290,7 +2290,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">31.08.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2344,7 +2344,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2416,7 +2416,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2500,7 +2500,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2566,7 +2566,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2635,7 +2635,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2713,7 +2713,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2791,7 +2791,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2872,7 +2872,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -2938,7 +2938,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -3028,7 +3028,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -3106,7 +3106,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -3169,7 +3169,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -3262,7 +3262,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -3337,7 +3337,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -3412,7 +3412,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -3478,7 +3478,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -3547,7 +3547,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
@ -3655,7 +3655,7 @@
|
|||
</datafield>
|
||||
</record>
|
||||
<record format="MarcXchange" type="Bibliographic">
|
||||
<leader>00000 2100000 000 </leader>
|
||||
<leader>00000 2200000 000 </leader>
|
||||
<datafield tag="903" ind1="9" ind2="1">
|
||||
<subfield code="a">01.09.2014</subfield>
|
||||
</datafield>
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -24,8 +24,8 @@
|
|||
<subfield code="c">Michael Chabon.</subfield>
|
||||
</datafield>
|
||||
<datafield ind2=" " ind1=" " tag="250">
|
||||
<subfield code=" "></subfield>
|
||||
<subfield code="a">1st ed.</subfield>
|
||||
<subfield code="a"> </subfield>
|
||||
</datafield>
|
||||
<datafield ind2=" " ind1=" " tag="260">
|
||||
<subfield code="a">New York :</subfield>
|
||||
|
|
Loading…
Reference in a new issue