use underscore und non-empty names for tags, indicators, subfield IDs
This commit is contained in:
parent
d2fa91317c
commit
153bac0a3f
18 changed files with 83 additions and 47 deletions
|
@ -43,6 +43,11 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
|
|
||||||
private static final String BLANK_STRING = " ";
|
private static final String BLANK_STRING = " ";
|
||||||
|
|
||||||
|
private static final char UNDERSCORE = '_';
|
||||||
|
|
||||||
|
private static final String UNDERSCORE_STRING = "_";
|
||||||
|
private static final String EMPTY_TAG = "___";
|
||||||
|
|
||||||
private static final Set<Character> ASCII_GRAPHICS = new HashSet<>(Arrays.asList(
|
private static final Set<Character> ASCII_GRAPHICS = new HashSet<>(Arrays.asList(
|
||||||
'\u0020', '\u0021', '\u0022', '\u0023', '\u0024', '\u0025', '\u0026', '\'',
|
'\u0020', '\u0021', '\u0022', '\u0023', '\u0024', '\u0025', '\u0026', '\'',
|
||||||
'\u0028', '\u0029', '\u002A', '\u002B', '\u002C', '\u002D', '\u002E', '\u002F',
|
'\u0028', '\u0029', '\u002A', '\u002B', '\u002C', '\u002D', '\u002E', '\u002F',
|
||||||
|
@ -207,8 +212,10 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
|
|
||||||
public boolean isTagValid() {
|
public boolean isTagValid() {
|
||||||
if (tag == null) {
|
if (tag == null) {
|
||||||
|
// we allow no tag
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// only tags of length 3 are supposed to be valid
|
||||||
return tag.length() == 3
|
return tag.length() == 3
|
||||||
&& ((tag.charAt(0) >= '0' && tag.charAt(0) <= '9')
|
&& ((tag.charAt(0) >= '0' && tag.charAt(0) <= '9')
|
||||||
|| (tag.charAt(0) >= 'A' && tag.charAt(0) <= 'Z'))
|
|| (tag.charAt(0) >= 'A' && tag.charAt(0) <= 'Z'))
|
||||||
|
@ -220,18 +227,20 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
|
|
||||||
public boolean isIndicatorValid() {
|
public boolean isIndicatorValid() {
|
||||||
if (isControl()) {
|
if (isControl()) {
|
||||||
|
// ignore indicator check for control fields
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (indicator == null) {
|
if (indicator == null) {
|
||||||
|
// we allow no indicator
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
boolean b = indicator.length() <= 9;
|
boolean b = indicator.length() <= 9;
|
||||||
for (int i = 0; i < indicator.length(); i++) {
|
for (int i = 0; i < indicator.length(); i++) {
|
||||||
b = indicator.charAt(i) == ' '
|
b = indicator.charAt(i) == UNDERSCORE
|
||||||
|| (indicator.charAt(i) >= '0' && indicator.charAt(i) <= '9')
|
|| (indicator.charAt(i) >= '0' && indicator.charAt(i) <= '9')
|
||||||
|| (indicator.charAt(i) >= 'a' && indicator.charAt(i) <= 'z')
|
|| (indicator.charAt(i) >= 'a' && indicator.charAt(i) <= 'z')
|
||||||
|| (indicator.charAt(i) >= 'A' && indicator.charAt(i) <= 'Z')
|
|| (indicator.charAt(i) >= 'A' && indicator.charAt(i) <= 'Z')
|
||||||
|| indicator.charAt(i) == '@'; // for our PICA hack
|
|| indicator.charAt(i) == '@'; // must be valid, for PICA dialect
|
||||||
if (!b) {
|
if (!b) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -241,9 +250,11 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
|
|
||||||
public boolean isSubfieldValid() {
|
public boolean isSubfieldValid() {
|
||||||
if (isControl()) {
|
if (isControl()) {
|
||||||
|
// for control fields, there are no subfields, disable check
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (subfieldIds == null) {
|
if (subfieldIds == null) {
|
||||||
|
// we allow no subfield ids
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
boolean b = true;
|
boolean b = true;
|
||||||
|
@ -256,6 +267,10 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the field has a valid tag (if present), a valid indicator (if present), and a valid subfield (if present).
|
||||||
|
* @return true if valid
|
||||||
|
*/
|
||||||
public boolean isValid() {
|
public boolean isValid() {
|
||||||
return isTagValid() && isIndicatorValid() && isSubfieldValid();
|
return isTagValid() && isIndicatorValid() && isSubfieldValid();
|
||||||
}
|
}
|
||||||
|
@ -381,7 +396,19 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
* @return this builder
|
* @return this builder
|
||||||
*/
|
*/
|
||||||
public Builder tag(String tag) {
|
public Builder tag(String tag) {
|
||||||
this.tag = tag;
|
if (tag != null) {
|
||||||
|
// We have inconsistent use of tag symbols as placeholders for a "blank space"
|
||||||
|
// and we need to fix it here for consistency.
|
||||||
|
this.tag = tag
|
||||||
|
.replace('-', UNDERSCORE)
|
||||||
|
.replace('#', UNDERSCORE)
|
||||||
|
.replace('.', UNDERSCORE)
|
||||||
|
.replace(' ', UNDERSCORE);
|
||||||
|
}
|
||||||
|
// do not allow null or empty tags
|
||||||
|
if (this.tag == null || this.tag.isEmpty()) {
|
||||||
|
this.tag = EMPTY_TAG;
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,8 +427,21 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
*/
|
*/
|
||||||
public Builder indicator(String indicator) {
|
public Builder indicator(String indicator) {
|
||||||
if (indicator != null) {
|
if (indicator != null) {
|
||||||
// check if indicators are visible replacements like "-" or "#" . Replace with blank.
|
// We have inconsistent use of indicator symbols as placeholders for a "blank space"
|
||||||
this.indicator = indicator.replace('-', ' ').replace('#', ' ');
|
// and we need to fix it here for consistency.
|
||||||
|
// Check if indicators are artifacts like "-" or "#" or '.' or ' '.
|
||||||
|
// Replace with underscore. This preserves better usage and visibility.
|
||||||
|
// Especially the dot. The dot will break Elasticsearch indexing with an exception.
|
||||||
|
// If you do not like underscores, replace them by a space character in your application.
|
||||||
|
this.indicator = indicator
|
||||||
|
.replace('-', UNDERSCORE)
|
||||||
|
.replace('#', UNDERSCORE)
|
||||||
|
.replace('.', UNDERSCORE)
|
||||||
|
.replace(' ', UNDERSCORE);
|
||||||
|
}
|
||||||
|
// we do not allow an empty indicator. Elasticsearch field names require a length > 0.
|
||||||
|
if (this.indicator != null && this.indicator.isEmpty()) {
|
||||||
|
this.indicator = UNDERSCORE_STRING;
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -612,7 +652,7 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
*/
|
*/
|
||||||
public boolean isControl() {
|
public boolean isControl() {
|
||||||
if (isControl == null) {
|
if (isControl == null) {
|
||||||
this.isControl = tag != null && tag.charAt(0) == '0' && tag.charAt(1) == '0';
|
this.isControl = tag != null && tag.length() >= 2 && tag.charAt(0) == '0' && tag.charAt(1) == '0';
|
||||||
}
|
}
|
||||||
return isControl;
|
return isControl;
|
||||||
}
|
}
|
||||||
|
@ -638,18 +678,13 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
* @return the built MARC field.
|
* @return the built MARC field.
|
||||||
*/
|
*/
|
||||||
public MarcField build() {
|
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,
|
return new MarcField(tag, indicator, position, length,
|
||||||
value, subfields, subfieldIds.toString(), isControl);
|
value, subfields, subfieldIds.toString(), isControl());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "tag=" + tag + ",indicator=" + indicator +
|
return "tag=" + tag + ",indicator=" + indicator + ",value=" + value + ",subfields=" + subfields;
|
||||||
",value=" + value + ",subfields=" +
|
|
||||||
subfields;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -658,12 +693,24 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
*/
|
*/
|
||||||
public static class Subfield {
|
public static class Subfield {
|
||||||
|
|
||||||
private final String id;
|
private String id;
|
||||||
|
|
||||||
private final String value;
|
private final String value;
|
||||||
|
|
||||||
private Subfield(String id, String value) {
|
private Subfield(String id, String value) {
|
||||||
this.id = id;
|
if (id != null) {
|
||||||
|
// We have inconsistent use of subfield id symbols as placeholders for a "blank space"
|
||||||
|
// and we need to fix it here for consistency.
|
||||||
|
this.id = id
|
||||||
|
.replace('-', UNDERSCORE)
|
||||||
|
.replace('#', UNDERSCORE)
|
||||||
|
.replace('.', UNDERSCORE)
|
||||||
|
.replace(' ', UNDERSCORE);
|
||||||
|
}
|
||||||
|
// we do not allow an empty subfield id. Elasticsearch field names require a length > 0.
|
||||||
|
if (this.id != null && this.id.isEmpty()) {
|
||||||
|
this.id = UNDERSCORE_STRING;
|
||||||
|
}
|
||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -689,10 +736,9 @@ public class MarcField implements Comparable<MarcField> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("serial")
|
||||||
private static class SubfieldIds extends LinkedList<String> {
|
private static class SubfieldIds extends LinkedList<String> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 7016733919690084153L;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insertion sort. This is considered faster than sorting afterwards,
|
* Insertion sort. This is considered faster than sorting afterwards,
|
||||||
* especially for short lists (we have << 10 subfields at average in a field).
|
* especially for short lists (we have << 10 subfields at average in a field).
|
||||||
|
|
|
@ -24,10 +24,9 @@ import java.util.TreeMap;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("serial")
|
||||||
public class MarcFieldDirectory extends TreeMap<Integer, MarcField.Builder> {
|
public class MarcFieldDirectory extends TreeMap<Integer, MarcField.Builder> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 4339262603982720001L;
|
|
||||||
|
|
||||||
public MarcFieldDirectory(RecordLabel label, String encodedDirectory) throws IOException {
|
public MarcFieldDirectory(RecordLabel label, String encodedDirectory) throws IOException {
|
||||||
super();
|
super();
|
||||||
if (label == null) {
|
if (label == null) {
|
||||||
|
|
|
@ -33,12 +33,11 @@ import java.util.stream.Collectors;
|
||||||
/**
|
/**
|
||||||
* A MARC record. This is an extended MARC record augmented with MarcXchange information.
|
* A MARC record. This is an extended MARC record augmented with MarcXchange information.
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("serial")
|
||||||
public class MarcRecord extends LinkedHashMap<String, Object> {
|
public class MarcRecord extends LinkedHashMap<String, Object> {
|
||||||
|
|
||||||
private static final MarcRecord EMPTY = Marc.builder().buildRecord();
|
private static final MarcRecord EMPTY = Marc.builder().buildRecord();
|
||||||
|
|
||||||
private static final long serialVersionUID = 5305809148724342653L;
|
|
||||||
|
|
||||||
private final String format;
|
private final String format;
|
||||||
|
|
||||||
private final String type;
|
private final String type;
|
||||||
|
@ -184,7 +183,6 @@ public class MarcRecord extends LinkedHashMap<String, Object> {
|
||||||
}
|
}
|
||||||
String indicator = marcField.getIndicator();
|
String indicator = marcField.getIndicator();
|
||||||
if (indicator != null && !indicator.isEmpty()) {
|
if (indicator != null && !indicator.isEmpty()) {
|
||||||
indicator = indicator.replace(' ', '_');
|
|
||||||
Map<String, Object> indicators = new LinkedHashMap<>();
|
Map<String, Object> indicators = new LinkedHashMap<>();
|
||||||
repeatMap.put(Integer.toString(repeat), indicators);
|
repeatMap.put(Integer.toString(repeat), indicators);
|
||||||
if (!indicators.containsKey(indicator)) {
|
if (!indicators.containsKey(indicator)) {
|
||||||
|
@ -197,7 +195,6 @@ public class MarcRecord extends LinkedHashMap<String, Object> {
|
||||||
} else {
|
} else {
|
||||||
for (MarcField.Subfield subfield : marcField.getSubfields()) {
|
for (MarcField.Subfield subfield : marcField.getSubfields()) {
|
||||||
String code = subfield.getId();
|
String code = subfield.getId();
|
||||||
code = code.replace(' ', '_');
|
|
||||||
Object subfieldValue = subfields.get(code);
|
Object subfieldValue = subfields.get(code);
|
||||||
if (subfieldValue instanceof List) {
|
if (subfieldValue instanceof List) {
|
||||||
List<String> list = (List<String>) subfieldValue;
|
List<String> list = (List<String>) subfieldValue;
|
||||||
|
|
|
@ -16,10 +16,9 @@
|
||||||
*/
|
*/
|
||||||
package org.xbib.marc.json;
|
package org.xbib.marc.json;
|
||||||
|
|
||||||
|
@SuppressWarnings("serial")
|
||||||
public class JsonException extends RuntimeException {
|
public class JsonException extends RuntimeException {
|
||||||
|
|
||||||
private static final long serialVersionUID = -3386151672072419281L;
|
|
||||||
|
|
||||||
JsonException(Throwable throwable) {
|
JsonException(Throwable throwable) {
|
||||||
super(throwable);
|
super(throwable);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,10 +32,9 @@ import java.util.regex.Pattern;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("serial")
|
||||||
public class MarcFieldTransformer extends LinkedHashMap<String, MarcField> {
|
public class MarcFieldTransformer extends LinkedHashMap<String, MarcField> {
|
||||||
|
|
||||||
private static final long serialVersionUID = -3250616818472683245L;
|
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(MarcFieldTransformer.class.getName());
|
private static final Logger logger = Logger.getLogger(MarcFieldTransformer.class.getName());
|
||||||
|
|
||||||
// the repeat counter pattern, simple integer
|
// the repeat counter pattern, simple integer
|
||||||
|
@ -47,7 +46,7 @@ public class MarcFieldTransformer extends LinkedHashMap<String, MarcField> {
|
||||||
private transient MarcField lastReceived;
|
private transient MarcField lastReceived;
|
||||||
private transient MarcField lastBuilt;
|
private transient MarcField lastBuilt;
|
||||||
private int repeatCounter;
|
private int repeatCounter;
|
||||||
private Operator operator;
|
private final Operator operator;
|
||||||
|
|
||||||
private MarcFieldTransformer(Map<String, MarcField> map, boolean ignoreIndicator, boolean ignoreSubfieldIds,
|
private MarcFieldTransformer(Map<String, MarcField> map, boolean ignoreIndicator, boolean ignoreSubfieldIds,
|
||||||
Operator operator) {
|
Operator operator) {
|
||||||
|
|
|
@ -268,7 +268,7 @@ public class MarcContentHandler
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startDocument() throws SAXException {
|
public void startDocument() throws SAXException {
|
||||||
stack.clear();
|
stack = new LinkedList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -514,11 +514,6 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
|
||||||
|
|
||||||
private void setupEventConsumer(Writer writer, boolean indent) throws IOException {
|
private void setupEventConsumer(Writer writer, boolean indent) throws IOException {
|
||||||
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
|
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
|
||||||
try {
|
|
||||||
outputFactory.setProperty("com.ctc.wstx.useDoubleQuotesInXmlDecl", Boolean.TRUE);
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
logger.log(Level.FINEST, e.getMessage(), e);
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
this.xmlEventConsumer = indent ?
|
this.xmlEventConsumer = indent ?
|
||||||
new IndentingXMLEventWriter(outputFactory.createXMLEventWriter(writer)) :
|
new IndentingXMLEventWriter(outputFactory.createXMLEventWriter(writer)) :
|
||||||
|
|
|
@ -43,10 +43,10 @@ public class ConcurrencyTest {
|
||||||
writer.startDocument();
|
writer.startDocument();
|
||||||
writer.beginCollection();
|
writer.beginCollection();
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
InputStream in = getClass().getResource(s).openStream();
|
InputStream inputStream = getClass().getResource(s).openStream();
|
||||||
executorService.submit(() -> {
|
executorService.submit(() -> {
|
||||||
Marc.builder()
|
Marc.builder()
|
||||||
.setInputStream(in)
|
.setInputStream(inputStream)
|
||||||
.setMarcRecordListener(writer)
|
.setMarcRecordListener(writer)
|
||||||
.build()
|
.build()
|
||||||
.writeRecords();
|
.writeRecords();
|
||||||
|
|
|
@ -160,7 +160,7 @@ public class MarcFieldTest {
|
||||||
.subfield("d", null)
|
.subfield("d", null)
|
||||||
.subfield("e", null)
|
.subfield("e", null)
|
||||||
.build();
|
.build();
|
||||||
assertEquals("901$ $ade", marcField.toKey());
|
assertEquals("901$__$ade", marcField.toKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -7,7 +7,10 @@ import org.xbib.marc.Marc;
|
||||||
import org.xmlunit.matchers.CompareMatcher;
|
import org.xmlunit.matchers.CompareMatcher;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
|
import java.io.Writer;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import javax.xml.stream.XMLInputFactory;
|
import javax.xml.stream.XMLInputFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -34,11 +37,9 @@ public class MarcEventConsumerTest {
|
||||||
writer.setFormat("AlephXML").setType("Bibliographic");
|
writer.setFormat("AlephXML").setType("Bibliographic");
|
||||||
writer.startDocument();
|
writer.startDocument();
|
||||||
writer.beginCollection();
|
writer.beginCollection();
|
||||||
|
|
||||||
MarcXchangeEventConsumer consumer = new MarcXchangeEventConsumer();
|
MarcXchangeEventConsumer consumer = new MarcXchangeEventConsumer();
|
||||||
consumer.setMarcListener(writer);
|
consumer.setMarcListener(writer);
|
||||||
consumer.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd");
|
consumer.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd");
|
||||||
|
|
||||||
Marc.builder()
|
Marc.builder()
|
||||||
.setInputStream(in)
|
.setInputStream(in)
|
||||||
.setCharset(StandardCharsets.UTF_8)
|
.setCharset(StandardCharsets.UTF_8)
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
||||||
<?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="MARC21" type="Bibliographic"><leader>00759cam a2200229 a 4500</leader><controlfield tag="001">11939876</controlfield><controlfield tag="005">20041229190604.0</controlfield><controlfield tag="008">000313s2000 nyu 000 1 eng </controlfield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">0679450041 (acid-free paper)</subfield></datafield><datafield tag="040" ind1=" " ind2=" "><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield tag="100" ind1="1" ind2=" "><subfield code="a">Chabon, Michael.</subfield></datafield><datafield tag="245" ind1="1" ind2="4"><subfield code="a">The amazing adventures of Kavalier and Clay :</subfield><subfield code="b">a novel /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="a">New York :</subfield><subfield code="b">Random House,</subfield><subfield code="c">c2000.</subfield></datafield><datafield tag="300" ind1=" " ind2=" "><subfield code="a">639 p. ;</subfield><subfield code="c">25 cm.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Comic books, strips, etc.</subfield><subfield code="x">Authorship</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Heroes in mass media</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Czech Americans</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="651" ind1=" " ind2="0"><subfield code="a">New York (N.Y.)</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Young men</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Cartoonists</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="655" ind1=" " ind2="7"><subfield code="a">Humorous stories.</subfield><subfield code="2">gsafd</subfield></datafield><datafield tag="655" ind1=" " ind2="7"><subfield code="a">Bildungsromane.</subfield><subfield code="2">gsafd</subfield></datafield></record><record format="MARC21" type="Bibliographic"><leader>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">0786808772</subfield></datafield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield tag="040" ind1=" " ind2=" "><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield tag="100" ind1="1" ind2=" "><subfield code="a">Chabon, Michael.</subfield></datafield><datafield tag="245" ind1="1" ind2="0"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield tag="250" ind1=" " ind2=" "><subfield code="a">1st ed.</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield tag="300" ind1=" " ind2=" "><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield tag="520" ind1=" " ind2=" "><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Fantasy.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection>
|
<?xml version="1.0" encoding="UTF-8"?><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>00759cam a2200229 a 4500</leader><controlfield tag="001">11939876</controlfield><controlfield tag="005">20041229190604.0</controlfield><controlfield tag="008">000313s2000 nyu 000 1 eng </controlfield><datafield ind2="_" ind1="_" tag="020"><subfield code="a">0679450041 (acid-free paper)</subfield></datafield><datafield ind2="_" ind1="_" tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2="_" ind1="1" tag="100"><subfield code="a">Chabon, Michael.</subfield></datafield><datafield ind2="4" ind1="1" tag="245"><subfield code="a">The amazing adventures of Kavalier and Clay :</subfield><subfield code="b">a novel /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield ind2="_" ind1="_" tag="260"><subfield code="a">New York :</subfield><subfield code="b">Random House,</subfield><subfield code="c">c2000.</subfield></datafield><datafield ind2="_" ind1="_" tag="300"><subfield code="a">639 p. ;</subfield><subfield code="c">25 cm.</subfield></datafield><datafield ind2="0" ind1="_" tag="650"><subfield code="a">Comic books, strips, etc.</subfield><subfield code="x">Authorship</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1="_" tag="650"><subfield code="a">Heroes in mass media</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1="_" tag="650"><subfield code="a">Czech Americans</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1="_" tag="651"><subfield code="a">New York (N.Y.)</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1="_" tag="650"><subfield code="a">Young men</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1="_" tag="650"><subfield code="a">Cartoonists</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="7" ind1="_" tag="655"><subfield code="a">Humorous stories.</subfield><subfield code="2">gsafd</subfield></datafield><datafield ind2="7" ind1="_" tag="655"><subfield code="a">Bildungsromane.</subfield><subfield code="2">gsafd</subfield></datafield></record><record format="MARC21" type="Bibliographic"><leader>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield ind2="_" ind1="_" tag="020"><subfield code="a">0786808772</subfield></datafield><datafield ind2="_" ind1="_" tag="020"><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield ind2="_" ind1="_" tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2="_" ind1="1" tag="100"><subfield code="a">Chabon, Michael.</subfield></datafield><datafield ind2="0" ind1="1" tag="245"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield ind2="_" ind1="_" tag="250"><subfield code="a">1st ed.</subfield></datafield><datafield ind2="_" ind1="_" tag="260"><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield ind2="_" ind1="_" tag="300"><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield ind2="_" ind1="_" tag="520"><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Fantasy.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection>
|
|
@ -1 +1 @@
|
||||||
<?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="MARC21" type="Bibliographic"><leader>03059cam 2200301 i 4500</leader><controlfield tag="001"> 77123332 </controlfield><controlfield tag="003">DLC</controlfield><controlfield tag="005">20051218154744.0</controlfield><controlfield tag="008">981008b2001 ilu 000 0 eng </controlfield><datafield tag="040" ind1=" " ind2=" "><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield tag="010" ind1=" " ind2=" "><subfield code="a"> 77123332 </subfield></datafield><datafield tag="245" ind1="0" ind2="0"><subfield code="a">OCLC diacritic and special character test record.</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="a">ny :</subfield><subfield code="b">ny,</subfield><subfield code="c">2001.</subfield></datafield><datafield tag="300" ind1=" " ind2=" "><subfield code="a">100 p. ;</subfield><subfield code="c">12 cm.</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 0 (NEW): Degree sign (°); Phono Copyright mark (℗); Copyright mark (©); Sharp (♯); Inverted Question mark (¿); Inverted Exclamation mark (¡); Eszett (ß); Euro (€).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 1: Script L (ℓ); Polish L (Ł); Scandanavian O (Ø); D with Crossbar (Đ); Icelandic Thorn (Þ); AE Digraph (Æ); OE Digraph (Œ); Miagkii Znak (ʹ); Dot at Midline (·).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 2: Musical Flat (♭); Patent Mark (®); Plus or Minus (±); O Hook (Ơ); U Hook (Ư); Alif (ʼ); alpha (α); Ayn (ʻ); Polish l (ł).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 3: Scandanavian o (ø); d with crossbar (đ); Icelandic Thorn (þ); ae Digraph (æ); oe Digraph (œ); Tverdii Znak (ʺ); Turkish i (ı); British Pound (£); eth (ð).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 4: Dagger (DO NOT USE); o Hook (ơ); u Hook (ư); Beta (β); Gamma (γ); Superscript 0 (⁰); Superscript 1 (¹); Superscript 2 (²); Superscript 3 (³).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 5: Superscript 4 (⁴); Superscript 5 (⁵); Superscript 6 (⁶); Superscript 7 (⁷); Superscript 8 (⁸); Superscript 9 (⁹); Superscript + (⁺); Superscript - (⁻); Superscript ( (⁽).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 6: Superscript ) (⁾); Subscript 0 (₀); Subscript 1 (₁); Subscript 2 (₂); Subscript 3 (₃); Subscript 4 (₄); Subscript 5 (₅); Subscript 6 (₆); Subscript 7 (₇).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 7: Subscript 8 (₈); Subscript 9 (₉); Subscript + (₊); Subscript - (₋); Subscript ( (₍); Subscript ) (₎); Pseudo Question Mark (ỏ); Grave (ò); Acute (ó).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 8: Circumflex (ô); Tilde (õ); Macron (ō); Breve (ŏ); Superior Dot (ȯ); Umlaut (ö); Hacek (ǒ); Circle Above (o̊); Ligature left (o͡).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 9: Ligature right (o) ; High Comma off center (o̕); Double Acute (ő); Candrabindu (o̐); Cedilla (o̧); Right Hook (ǫ); Dot Below (ọ); Double Dot Below (o̤); Circle Below (o̥).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER COLUMN 10: Double Underscore (o̳); Underscore (o̲); Left Hook (o̦); Right Cedilla (o̜); Upadhmaniya (o̮); Double Tilde 1st half (o͠); Double Tilde 2nd half (o) ; High Comma centered (o̓).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">VOYAGER PC Keyboard: Spacing Circumflex (^); Spacing Underscore (_); Spacing Grave (`); Open Curly Bracket ({); Close Curly Bracket (}); Spacing Tilde (~).</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">Standard PC Keyboard: 1234567890-= !@#$%^&*()_+ qwertyuiop[]\ QWERTYUIOP{}| asdfghjkl;' ASDFGHJKL:" zxcvbnm,./ ZXCVBNM<>?</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">Double Tilde, 1st and 2nd halves (o͠o) ; Ligature, both halves (o͡o).</subfield></datafield></record></collection>
|
<?xml version="1.0" encoding="UTF-8"?><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>03059cam 2200301 i 4500</leader><controlfield tag="001"> 77123332 </controlfield><controlfield tag="003">DLC</controlfield><controlfield tag="005">20051218154744.0</controlfield><controlfield tag="008">981008b2001 ilu 000 0 eng </controlfield><datafield ind2="_" ind1="_" tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2="_" ind1="_" tag="010"><subfield code="a"> 77123332 </subfield></datafield><datafield ind2="0" ind1="0" tag="245"><subfield code="a">OCLC diacritic and special character test record.</subfield></datafield><datafield ind2="_" ind1="_" tag="260"><subfield code="a">ny :</subfield><subfield code="b">ny,</subfield><subfield code="c">2001.</subfield></datafield><datafield ind2="_" ind1="_" tag="300"><subfield code="a">100 p. ;</subfield><subfield code="c">12 cm.</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 0 (NEW): Degree sign (°); Phono Copyright mark (℗); Copyright mark (©); Sharp (♯); Inverted Question mark (¿); Inverted Exclamation mark (¡); Eszett (ß); Euro (€).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 1: Script L (ℓ); Polish L (Ł); Scandanavian O (Ø); D with Crossbar (Đ); Icelandic Thorn (Þ); AE Digraph (Æ); OE Digraph (Œ); Miagkii Znak (ʹ); Dot at Midline (·).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 2: Musical Flat (♭); Patent Mark (®); Plus or Minus (±); O Hook (Ơ); U Hook (Ư); Alif (ʼ); alpha (α); Ayn (ʻ); Polish l (ł).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 3: Scandanavian o (ø); d with crossbar (đ); Icelandic Thorn (þ); ae Digraph (æ); oe Digraph (œ); Tverdii Znak (ʺ); Turkish i (ı); British Pound (£); eth (ð).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 4: Dagger (DO NOT USE); o Hook (ơ); u Hook (ư); Beta (β); Gamma (γ); Superscript 0 (⁰); Superscript 1 (¹); Superscript 2 (²); Superscript 3 (³).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 5: Superscript 4 (⁴); Superscript 5 (⁵); Superscript 6 (⁶); Superscript 7 (⁷); Superscript 8 (⁸); Superscript 9 (⁹); Superscript + (⁺); Superscript - (⁻); Superscript ( (⁽).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 6: Superscript ) (⁾); Subscript 0 (₀); Subscript 1 (₁); Subscript 2 (₂); Subscript 3 (₃); Subscript 4 (₄); Subscript 5 (₅); Subscript 6 (₆); Subscript 7 (₇).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 7: Subscript 8 (₈); Subscript 9 (₉); Subscript + (₊); Subscript - (₋); Subscript ( (₍); Subscript ) (₎); Pseudo Question Mark (ỏ); Grave (ò); Acute (ó).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 8: Circumflex (ô); Tilde (õ); Macron (ō); Breve (ŏ); Superior Dot (ȯ); Umlaut (ö); Hacek (ǒ); Circle Above (o̊); Ligature left (o͡).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 9: Ligature right (o) ; High Comma off center (o̕); Double Acute (ő); Candrabindu (o̐); Cedilla (o̧); Right Hook (ǫ); Dot Below (ọ); Double Dot Below (o̤); Circle Below (o̥).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 10: Double Underscore (o̳); Underscore (o̲); Left Hook (o̦); Right Cedilla (o̜); Upadhmaniya (o̮); Double Tilde 1st half (o͠); Double Tilde 2nd half (o) ; High Comma centered (o̓).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER PC Keyboard: Spacing Circumflex (^); Spacing Underscore (_); Spacing Grave (`); Open Curly Bracket ({); Close Curly Bracket (}); Spacing Tilde (~).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">Standard PC Keyboard: 1234567890-= !@#$%^&*()_+ qwertyuiop[]\ QWERTYUIOP{}| asdfghjkl;' ASDFGHJKL:" zxcvbnm,./ ZXCVBNM<>?</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">Double Tilde, 1st and 2nd halves (o͠o) ; Ligature, both halves (o͡o).</subfield></datafield></record></collection>
|
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
||||||
<?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="MARC21" type="Bibliographic"><leader>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">0786808772</subfield></datafield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield tag="040" ind1=" " ind2=" "><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield tag="100" ind1="1" ind2=" "><subfield code="a">Chabon, Michael.</subfield></datafield><datafield tag="245" ind1="1" ind2="0"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield tag="250" ind1=" " ind2=" "><subfield code="a">1st ed.</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield tag="300" ind1=" " ind2=" "><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield tag="520" ind1=" " ind2=" "><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Fantasy.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection>
|
<?xml version="1.0" encoding="UTF-8"?><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>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield ind2="_" ind1="_" tag="020"><subfield code="a">0786808772</subfield></datafield><datafield ind2="_" ind1="_" tag="020"><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield ind2="_" ind1="_" tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2="_" ind1="1" tag="100"><subfield code="a">Chabon, Michael.</subfield></datafield><datafield ind2="0" ind1="1" tag="245"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield ind2="_" ind1="_" tag="250"><subfield code="a">1st ed.</subfield></datafield><datafield ind2="_" ind1="_" tag="260"><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield ind2="_" ind1="_" tag="300"><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield ind2="_" ind1="_" tag="520"><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Fantasy.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection>
|
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue