use underscore und non-empty names for tags, indicators, subfield IDs

This commit is contained in:
Jörg Prante 2022-10-14 18:05:46 +02:00
parent d2fa91317c
commit 153bac0a3f
18 changed files with 83 additions and 47 deletions

View file

@ -43,6 +43,11 @@ public class MarcField implements Comparable<MarcField> {
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(
'\u0020', '\u0021', '\u0022', '\u0023', '\u0024', '\u0025', '\u0026', '\'',
'\u0028', '\u0029', '\u002A', '\u002B', '\u002C', '\u002D', '\u002E', '\u002F',
@ -207,8 +212,10 @@ public class MarcField implements Comparable<MarcField> {
public boolean isTagValid() {
if (tag == null) {
// we allow no tag
return true;
}
// only tags of length 3 are supposed to be valid
return tag.length() == 3
&& ((tag.charAt(0) >= '0' && tag.charAt(0) <= '9')
|| (tag.charAt(0) >= 'A' && tag.charAt(0) <= 'Z'))
@ -220,18 +227,20 @@ public class MarcField implements Comparable<MarcField> {
public boolean isIndicatorValid() {
if (isControl()) {
// ignore indicator check for control fields
return true;
}
if (indicator == null) {
// we allow no indicator
return true;
}
boolean b = indicator.length() <= 9;
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) >= '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) {
break;
}
@ -241,9 +250,11 @@ public class MarcField implements Comparable<MarcField> {
public boolean isSubfieldValid() {
if (isControl()) {
// for control fields, there are no subfields, disable check
return true;
}
if (subfieldIds == null) {
// we allow no subfield ids
return true;
}
boolean b = true;
@ -256,6 +267,10 @@ public class MarcField implements Comparable<MarcField> {
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() {
return isTagValid() && isIndicatorValid() && isSubfieldValid();
}
@ -381,7 +396,19 @@ public class MarcField implements Comparable<MarcField> {
* @return this builder
*/
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;
}
@ -400,8 +427,21 @@ public class MarcField implements Comparable<MarcField> {
*/
public Builder indicator(String indicator) {
if (indicator != null) {
// check if indicators are visible replacements like "-" or "#" . Replace with blank.
this.indicator = indicator.replace('-', ' ').replace('#', ' ');
// We have inconsistent use of indicator symbols as placeholders for a "blank space"
// 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;
}
@ -612,7 +652,7 @@ public class MarcField implements Comparable<MarcField> {
*/
public boolean isControl() {
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;
}
@ -638,18 +678,13 @@ 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
public String toString() {
return "tag=" + tag + ",indicator=" + indicator +
",value=" + value + ",subfields=" +
subfields;
return "tag=" + tag + ",indicator=" + indicator + ",value=" + value + ",subfields=" + subfields;
}
}
@ -658,12 +693,24 @@ public class MarcField implements Comparable<MarcField> {
*/
public static class Subfield {
private final String id;
private String id;
private final 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;
}
@ -689,10 +736,9 @@ public class MarcField implements Comparable<MarcField> {
}
}
@SuppressWarnings("serial")
private static class SubfieldIds extends LinkedList<String> {
private static final long serialVersionUID = 7016733919690084153L;
/**
* Insertion sort. This is considered faster than sorting afterwards,
* especially for short lists (we have << 10 subfields at average in a field).

View file

@ -24,10 +24,9 @@ import java.util.TreeMap;
/**
*
*/
@SuppressWarnings("serial")
public class MarcFieldDirectory extends TreeMap<Integer, MarcField.Builder> {
private static final long serialVersionUID = 4339262603982720001L;
public MarcFieldDirectory(RecordLabel label, String encodedDirectory) throws IOException {
super();
if (label == null) {

View file

@ -33,12 +33,11 @@ import java.util.stream.Collectors;
/**
* A MARC record. This is an extended MARC record augmented with MarcXchange information.
*/
@SuppressWarnings("serial")
public class MarcRecord extends LinkedHashMap<String, Object> {
private static final MarcRecord EMPTY = Marc.builder().buildRecord();
private static final long serialVersionUID = 5305809148724342653L;
private final String format;
private final String type;
@ -184,7 +183,6 @@ public class MarcRecord extends LinkedHashMap<String, Object> {
}
String indicator = marcField.getIndicator();
if (indicator != null && !indicator.isEmpty()) {
indicator = indicator.replace(' ', '_');
Map<String, Object> indicators = new LinkedHashMap<>();
repeatMap.put(Integer.toString(repeat), indicators);
if (!indicators.containsKey(indicator)) {
@ -197,7 +195,6 @@ public class MarcRecord extends LinkedHashMap<String, Object> {
} else {
for (MarcField.Subfield subfield : marcField.getSubfields()) {
String code = subfield.getId();
code = code.replace(' ', '_');
Object subfieldValue = subfields.get(code);
if (subfieldValue instanceof List) {
List<String> list = (List<String>) subfieldValue;

View file

@ -16,10 +16,9 @@
*/
package org.xbib.marc.json;
@SuppressWarnings("serial")
public class JsonException extends RuntimeException {
private static final long serialVersionUID = -3386151672072419281L;
JsonException(Throwable throwable) {
super(throwable);
}

View file

@ -32,10 +32,9 @@ import java.util.regex.Pattern;
/**
*
*/
@SuppressWarnings("serial")
public class MarcFieldTransformer extends LinkedHashMap<String, MarcField> {
private static final long serialVersionUID = -3250616818472683245L;
private static final Logger logger = Logger.getLogger(MarcFieldTransformer.class.getName());
// the repeat counter pattern, simple integer
@ -47,7 +46,7 @@ public class MarcFieldTransformer extends LinkedHashMap<String, MarcField> {
private transient MarcField lastReceived;
private transient MarcField lastBuilt;
private int repeatCounter;
private Operator operator;
private final Operator operator;
private MarcFieldTransformer(Map<String, MarcField> map, boolean ignoreIndicator, boolean ignoreSubfieldIds,
Operator operator) {

View file

@ -268,7 +268,7 @@ public class MarcContentHandler
@Override
public void startDocument() throws SAXException {
stack.clear();
stack = new LinkedList<>();
}
@Override

View file

@ -514,11 +514,6 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
private void setupEventConsumer(Writer writer, boolean indent) throws IOException {
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
try {
outputFactory.setProperty("com.ctc.wstx.useDoubleQuotesInXmlDecl", Boolean.TRUE);
} catch (IllegalArgumentException e) {
logger.log(Level.FINEST, e.getMessage(), e);
}
try {
this.xmlEventConsumer = indent ?
new IndentingXMLEventWriter(outputFactory.createXMLEventWriter(writer)) :

View file

@ -43,10 +43,10 @@ public class ConcurrencyTest {
writer.startDocument();
writer.beginCollection();
for (int i = 0; i < n; i++) {
InputStream in = getClass().getResource(s).openStream();
InputStream inputStream = getClass().getResource(s).openStream();
executorService.submit(() -> {
Marc.builder()
.setInputStream(in)
.setInputStream(inputStream)
.setMarcRecordListener(writer)
.build()
.writeRecords();

View file

@ -160,7 +160,7 @@ public class MarcFieldTest {
.subfield("d", null)
.subfield("e", null)
.build();
assertEquals("901$ $ade", marcField.toKey());
assertEquals("901$__$ade", marcField.toKey());
}
@Test

View file

@ -7,7 +7,10 @@ import org.xbib.marc.Marc;
import org.xmlunit.matchers.CompareMatcher;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.xml.stream.XMLInputFactory;
/**
@ -34,11 +37,9 @@ public class MarcEventConsumerTest {
writer.setFormat("AlephXML").setType("Bibliographic");
writer.startDocument();
writer.beginCollection();
MarcXchangeEventConsumer consumer = new MarcXchangeEventConsumer();
consumer.setMarcListener(writer);
consumer.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd");
Marc.builder()
.setInputStream(in)
.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

View file

@ -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>

View file

@ -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-= !@#$%^&amp;*()_+ qwertyuiop[]\ QWERTYUIOP{}| asdfghjkl;' ASDFGHJKL:" zxcvbnm,./ ZXCVBNM&lt;&gt;?</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-= !@#$%^&amp;*()_+ qwertyuiop[]\ QWERTYUIOP{}| asdfghjkl;' ASDFGHJKL:" zxcvbnm,./ ZXCVBNM&lt;&gt;?</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

View file

@ -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