5. Marc21-XML-Datei erstellen
Kapitel hinzufügen

<code>
// ------------------------------------------------------------------------------------------
// Date:   2017/11/08
// Author: RLO/KPA
// ------------------------------------------------------------------------------------------
// History:
//
// 2017-08-22 RLO: changes in Field 100 (added role and rolename)
// 2017-08-22 RLO: added constant fields 336, 337, 338
// 2017-08-22 RLO: callname (Signatur): moved from Field 850 to Field 852
// 2017-08-23 RLO: added constant field 040
// 2017-08-30 RLO: field 936: changes for volume/month subfields
// 2017-11-08 RLO/KPA: setting GND fields only if GND value is not empty
//
// ------------------------------------------------------------------------------------------
// Testweises Erzeugen eines MARC21 XML-Files mittels Scripting
// wichtig: Am Ende _MUSS_ der generierte XML-String als Ergebnis zurückgegeben werden !
//
// WICHTIG: datafield Tags IMMER in aufsteigender Reihenfolge erzeugen!
//
// ------------------------------------------------------------------------------------------

// -----------------------------------------------------------
// -----------------------------------------------------------
// Indexnames as Script-Variables:
// use them instead numerics...
// -----------------------------------------------------------
// -----------------------------------------------------------

ind_Order_ID                              =  1;   // Index Order-ID  Type: Zeichenkette [kein zugeordneter Meta-Daten-Typ]: myBib eDoc Order-Number
ind_Titel_der_Zeitung_Zeitschrift         =  2;   // Index Titel der Zeitung/Zeitschrift  Type: Zeichenkette [Titel]:
ind_Verlag                                =  3;   // Index Verlag  Type: Zeichenkette [Verlag]:
ind_Erscheinungsort                       =  4;   // Index Erscheinungsort  Type: Zeichenkette [Ort der Veröffentlichung]:
ind_ZDB_ID                                =  5;   // Index ZDB-ID  Type: Zahl [ZDB ID]:
ind_Titel_des_Artikels                    =  6;   // Index Titel des Artikels  Type: Zeichenkette [Artikel-Titel]:
ind_Untertitel_des_Artikels               =  7;   // Index Untertitel des Artikels  Type: Zeichenkette [Artikel-Untertitel]:
ind_Sprache_des_Artikels                  =  8;   // Index Sprache des Artikels  Type: Sammlung (Optionsliste mit Mehrfachauswahl) [Sprache]:
ind_Erscheinungsdatum                     =  9;   // Index Erscheinungsdatum  Type: Zeichenkette [Article-Date]:
ind_Band                                  = 10;   // Index Band  Type: Zeichenkette [Band]:
ind_Jahr                                  = 11;   // Index Jahr  Type: Zeichenkette [Datum der Veröffentlichung]: Jahr des Bandes oder Heftes
ind_Seitenangabe                          = 12;   // Index Seitenangabe  Type: Zeichenkette [Seitenangabe]: von - bis
ind_Fotos                                 = 13;   // Index Fotos  Type: Optionsliste [kein zugeordneter Meta-Daten-Typ]: Fotos

ind_Autoren_des_Artikels                  = 14;   // Index Autoren des Artikels  Type: Tabelle [Artikel-Autor]: Artikel-Autoren
     col_Autor_Autorname                  =  1;   // Column Autorname  Type: Zeichenkette [Artikel-Autor]: Name des Autors in Ansetzungsform
     col_Autor_Lebensdaten                =  2;   // Column Lebensdaten  Type: Zeichenkette [Lebensdaten]: Geburts- und Sterbedaten
     col_Autor_GND_ID_des_Autors          =  3;   // Column GND ID des Autors  Type: Zeichenkette [GND ID]:

ind_Sonstige_Personen                     = 15;   // Index Sonstige Personen  Type: Tabelle [Andere Person]:
     col_Sonst_Name                       =  1;   // Column Name  Type: Zeichenkette [Andere Person]:
     col_Sonst_Rolle                      =  2;   // Column Rolle  Type: Optionsliste [Rolle der Person]: Rolle der Person
     col_Sonst_Lebensdaten                =  3;   // Column Lebensdaten  Type: Zeichenkette [Lebensdaten]:
     col_Sonst_GND_ID                     =  4;   // Column GND ID  Type: Zahl [GND ID]:

ind_Schlagworte                           = 16;   // Index Schlagworte  Type: Tabelle [Schlagwort]: Schlagworte
     col_Schla_Schlagwort                 =  1;   // Column Schlagwort  Type: Zeichenkette [Schlagwort]: Schlagwort
     col_Schla_GND_ID                     =  2;   // Column GND-ID  Type: Zeichenkette [GND ID Schlagwort]: GND-ID

ind_Organisation_Koerperschaft            = 17;   // Index Organisation/Körperschaft  Type: Tabelle [Körperschaft]: Organisation/Körperschaft
     col_Organ_Organisation_Koerperschaft =  1;   // Column Organisation/Körperschaft  Type: Zeichenkette [Körperschaft]: Organisation/Körperschaft
     col_Organ_GND_ID                     =  2;   // Column GND-ID  Type: Zeichenkette [GND ID]: GND-ID

ind_Veranstaltungen                       = 18;   // Index Veranstaltungen  Type: Tabelle [Veranstaltung]: Veranstaltungen
     col_Veran_Veranstaltung              =  1;   // Column Veranstaltung  Type: Zeichenkette [Veranstaltung]: Veranstaltung
     col_Veran_GND_ID                     =  2;   // Column GND-ID  Type: Zeichenkette [GND ID]: GND-ID
     col_Veran_Ort                        =  3;   // Column Ort  Type: Zeichenkette [kein zugeordneter Meta-Daten-Typ]: Ort
     col_Veran_Zeitraum                   =  4;   // Column Zeitraum  Type: Zeichenkette [Lebensdaten]: Zeitraum oder Tag der Veranstaltung

ind_Kuenstler                             = 19;   // Index Künstler  Type: Tabelle [Artist]: Künstler
     col_Kuens_Kuenstler                  =  1;   // Column Künstler  Type: Zeichenkette [Artist]: Name des Autors in Ansetzungsform
     col_Kuens_Rolle                      =  2;   // Column Rolle  Type: Optionsliste [Rolle der Person]: Rolle der Person
     col_Kuens_Lebensdaten                =  3;   // Column Lebensdaten  Type: Zeichenkette [Lebensdaten]: Geburts- und Sterbedaten
     col_Kuens_GND_ID_Kuenstler           =  4;   // Column GND ID Künstler  Type: Zeichenkette [GND ID]:

ind_Textgattung                           = 20;   // Index Textgattung  Type: Optionsliste [kein zugeordneter Meta-Daten-Typ]: Textgattung
ind_Kategorie                             = 21;   // Index Kategorie  Type: Optionsliste [Typ (Monographie, Periodikum)]:
ind_Vorlagenart                           = 22;   // Index Vorlagenart  Type: Optionsliste [kein zugeordneter Meta-Daten-Typ]: Vorlagenart, Herkunftsangabe
ind_Medientyp                             = 23;   // Index Medientyp  Type: Optionsliste [Typ (Text, Karte, Video, Audio...)]:
ind_Genre                                 = 24;   // Index Genre  Type: Optionsliste [Genre]: Das Genre definiert den Typ des Mediums: (Monografie (Buch), Artikel, ...)
ind_Nutzungsrecht                         = 25;   // Index Nutzungsrecht  Type: Optionsliste [Copyright]: Copyright

// -----------------------------------------------------------
// -----------------------------------------------------------



//
// initialisieren...
//
xr.initMarc21Doc();

//
// der "Leader"...
//
xr.setLeader();

//
// controlfield 001 enthält als eindeutige Kennung die MyBib Auftragsnummer
//
xr.addControlField ('001', job.keyMap['ME_Order_ID']);

//
// controlfield 003 enthält als die jeweilige ISIL (entnommen aus ME-Feld 'or_responder_id'
//
xr.addControlField ('003', job.myBibOrderRec['or_responder_id']);

//
// controlField 007: Typ der Ressource: hier muss der Index-Wert auf 'cr' oder 'tu' gemappt werden...
//
if (job.index(18) == 'Online-Ressource')
    ressource_type = 'cr';
else
    ressource_type = 'tu';

xr.addControlField ('007', ressource_type);

//
// datafield 040: Konstantes Feld (SWB, Katz)
//
xr.addDataField ("", "", "040");
xr.addSubField ("e", "rda");


//
// datafield 041: Sprache des Artikels
//
xr.addDataField ("0", "", "041");
// subfield a: Sprache
xr.addSubField ("a", job.index(ind_Sprache_des_Artikels));


//
// Autoren:
//
// erster Autor in Feld 100, zwei weitere in Feld 700
// NOTA: 700er weiter unten wegen Reihenfolge...
// maximal drei...
//
if (job.indexNumRows(ind_Autoren_des_Artikels) >= 1) {

   //
   // erster Autor:
   //
   xr.addDataField ("1", "", "100");
   xr.addSubField  ("a", job.indexVal(ind_Autoren_des_Artikels, 1, col_Autor_Autorname));

   if (job.indexVal(ind_Autoren_des_Artikels, 1, col_Autor_GND_ID_des_Autors).length)
      xr.addSubField  ("0", "(DE-588)" + job.indexVal(ind_Autoren_des_Artikels, 1, col_Autor_GND_ID_des_Autors));

   xr.addSubField  ("e", "VerfasserIn");

   if (job.indexVal(ind_Autoren_des_Artikels, 1, col_Autor_GND_ID_des_Autors).length)
      xr.addSubField  ("2", "gnd");

   xr.addSubField  ("4", "aut");

} // job.indexNumRows(ind_Autoren_des_Artikels) >= 1

//
// datafield 245: Titel des Artikels
//
xr.addDataField ("1", "0", "245");
// subfield a: Titel
// subfield b: Untertitel
xr.addSubField ("a", job.index(ind_Titel_des_Artikels));
xr.addSubField ("b", job.index(ind_Untertitel_des_Artikels));


//
// datafield 264: Verlag, Ort, Jahr...
//
xr.addDataField ("", "1", "264");
// subfield a: Ort
// subfield b: Verlag
// subfield c: Datum
xr.addSubField ("a", job.index(ind_Erscheinungsort));
xr.addSubField ("b", job.index(ind_Verlag));
xr.addSubField ("c", job.index(ind_Erscheinungsdatum));

//
// datafield 336: Konstantes Feld (SWB, Katz)
//
xr.addDataField ("", "", "336");
xr.addSubField ("a", "Text");
xr.addSubField ("b", "txt");
xr.addSubField ("2", "rdacontent");

//
// datafield 337: Konstantes Feld (SWB, Katz)
//
xr.addDataField ("", "", "337");
xr.addSubField ("a", "ohne Hilfsmittel zu benutzen");
xr.addSubField ("b", "n");
xr.addSubField ("2", "rdamedia");

//
// datafield 338: Konstantes Feld (SWB, Katz)
//
xr.addDataField ("", "", "338");
xr.addSubField ("a", "Band");
xr.addSubField ("b", "nc");
xr.addSubField ("2", "rdacarrier");


//
// datafield 600: Kuenstler als Schlagwoerter
//
if (job.indexNumRows(ind_Kuenstler) >= 1) {

   //
   // iteriere ueber alle Kuenstler
   //
   for (i = 1; i <= job.indexNumRows(ind_Kuenstler); i++) {

      xr.addDataField ("1", "7", "600");
      xr.addSubField  ("a", job.indexVal(ind_Kuenstler, i, col_Kuens_Kuenstler));

      if (job.indexVal(ind_Kuenstler, i, col_Kuens_GND_ID_Kuenstler).length) {
         xr.addSubField  ("0", "(DE-588)" + job.indexVal(ind_Kuenstler, i, col_Kuens_GND_ID_Kuenstler));
         xr.addSubField  ("2", "gnd");
      }

   } // for i...

} // job.indexNumRows(ind_Kuenstler) >= 1



//
// datafield 610: Koerperschaften als Schlagwoerter
//
if (job.indexNumRows(ind_Organisation_Koerperschaft) >= 1) {

   //
   // iteriere ueber alle Koerperschaften
   //
   for (i = 1; i <= job.indexNumRows(ind_Organisation_Koerperschaft); i++) {

      xr.addDataField ("", "7", "610");
      xr.addSubField  ("a", job.indexVal(ind_Organisation_Koerperschaft, i, col_Organ_Organisation_Koerperschaft));

      if (job.indexVal(ind_Organisation_Koerperschaft, i, col_Organ_GND_ID).length) {
         xr.addSubField  ("0", "(DE-588)" + job.indexVal(ind_Organisation_Koerperschaft, i, col_Organ_GND_ID));
         xr.addSubField  ("2", "gnd");
      }

   } // for i...

} // job.indexNumRows(ind_Organisation_Koerperschaft) >= 1

//
// datafield 610: Veranstaltungen als Schlagwoerter
//
if (job.indexNumRows(ind_Veranstaltungen) >= 1) {

   //
   // iteriere ueber alle Koerperschaften
   //
   for (i = 1; i <= job.indexNumRows(ind_Veranstaltungen); i++) {

      xr.addDataField ("", "7", "610");
      xr.addSubField  ("a", job.indexVal(ind_Veranstaltungen, i, col_Veran_Veranstaltung));

      if (job.indexVal(ind_Veranstaltungen, i, col_Veran_GND_ID).length) {
         xr.addSubField  ("0", "(DE-588)" + job.indexVal(ind_Veranstaltungen, i, col_Veran_GND_ID));
         xr.addSubField  ("2", "gnd");
      }

   } // for i...

} // job.indexNumRows(ind_Veranstaltungen) >= 1


//
// datafield 650: titel des Dossiers
// 650: Nebeneintragung unter einem Schlagwort
//
xr.addDataField ("", "7", "650");
// subfield a: Text
// subfield 2: Quelle (hier wieder ISIL)
xr.addSubField ("a", job.myBibOrderRec['or_item_series_title']);
xr.addSubField ("2", job.myBibOrderRec['or_responder_id']);


//
// datafield 650: Schlagwoerter
//
if (job.indexNumRows(ind_Schlagworte) >= 1) {

   //
   // iteriere ueber alle Schlagwoeter
   //
   for (i = 1; i <= job.indexNumRows(ind_Schlagworte); i++) {

      xr.addDataField ("", "7", "650");
      xr.addSubField  ("a", job.indexVal(ind_Schlagworte, i, col_Schla_Schlagwort));

      if (job.indexVal(ind_Schlagworte, i, col_Schla_GND_ID).length) {
         xr.addSubField  ("0", "(DE-588)" + job.indexVal(ind_Schlagworte, i, col_Schla_GND_ID));
         xr.addSubField  ("2", "gnd");
      }

   } // for i...

} // job.indexNumRows(ind_Schlagworte) >= 1

//
// Tag 700
//
// weitere Autoren:
//
// erster Autor in Feld 100, zwei weitere in Feld 700
// maximal drei...
//

if (job.indexNumRows(ind_Autoren_des_Artikels) >= 2) {

   //
   // zweiter Autor:
   //
   xr.addDataField ("1", "", "700");
   xr.addSubField  ("a", job.indexVal(ind_Autoren_des_Artikels, 2, col_Autor_Autorname));

   if (job.indexVal(ind_Autoren_des_Artikels, 2, col_Autor_GND_ID_des_Autors).length)
      xr.addSubField  ("0", "(DE-588)" + job.indexVal(ind_Autoren_des_Artikels, 2, col_Autor_GND_ID_des_Autors));

   xr.addSubField  ("e", "VerfasserIn");

   if (job.indexVal(ind_Autoren_des_Artikels, 2, col_Autor_GND_ID_des_Autors).length)
      xr.addSubField  ("2", "gnd");

   xr.addSubField  ("4", "aut");

} // job.indexNumRows(ind_Autoren_des_Artikels) >= 2

if (job.indexNumRows(ind_Autoren_des_Artikels) >= 3) {

   //
   // zweiter Autor:
   //
   xr.addDataField ("1", "", "700");
   xr.addSubField  ("a", job.indexVal(ind_Autoren_des_Artikels, 3, col_Autor_Autorname));

   if (job.indexVal(ind_Autoren_des_Artikels, 3, col_Autor_GND_ID_des_Autors).length)
      xr.addSubField  ("0", "(DE-588)" + job.indexVal(ind_Autoren_des_Artikels, 3, col_Autor_GND_ID_des_Autors));

   xr.addSubField  ("e", "VerfasserIn");

   if (job.indexVal(ind_Autoren_des_Artikels, 3, col_Autor_GND_ID_des_Autors).length)
      xr.addSubField  ("2", "gnd");

   xr.addSubField  ("4", "aut");

} // job.indexNumRows(ind_Autoren_des_Artikels) >= 3

//
// datafield 700: sonstige beteiligte Personen
//
if (job.indexNumRows(ind_Sonstige_Personen) >= 1) {

   //
   // iteriere ueber alle sonstigen Personen...
   //
   for (i = 1; i <= job.indexNumRows(15); i++) {

      role        = job.indexVal(ind_Sonstige_Personen, i, col_Sonst_Rolle);
      role_abbrev = ut.subString(role, 0, 3);
      role_name   = ut.subString(role, 4);

      xr.addDataField ("1", "", "700");
      xr.addSubField  ("a", job.indexVal(ind_Sonstige_Personen, i, col_Sonst_Name));

      if (job.indexVal(ind_Sonstige_Personen, i, col_Sonst_GND_ID).length)
         xr.addSubField  ("0", "(DE-588)" + job.indexVal(ind_Sonstige_Personen, i, col_Sonst_GND_ID));

      if (job.indexVal(ind_Sonstige_Personen, i, col_Sonst_GND_ID).length)
         xr.addSubField  ("2", "gnd");

      xr.addSubField  ("e", role_name);
      xr.addSubField  ("4", role_abbrev);

   } // for i...

} // job.indexNumRows(ind_Sonstige_Personen) >= 1


//
// datafield 773: Titel der Zeitung/Zeitschrift
//
xr.addDataField ("0", "8", "773");
// subfield i: Text 'In'
// subfield t: Titel der Zeitschrift/Zeitung
// subfield w: ZDB-ID, (DE-600) wird vorangestellt
xr.addSubField ("i", "Enthalten in");
xr.addSubField ("t", job.index(ind_Titel_der_Zeitung_Zeitschrift));
xr.addSubField ("w", "(DE-600)" + job.index(ind_ZDB_ID));

//
// datafield 852: Signatur des Dossiers
//
xr.addDataField ("", "", "852");
// subfield a: ISIL
// subfield c: Signatur
xr.addSubField ("a", job.myBibOrderRec['or_responder_id']);
xr.addSubField ("e", job.myBibOrderRec['or_item_callname']);

//
// datafield 856: eL Link
//

//
// Aufruf-Formate: Java oder Web-Frontend...
//
// Web-Frontend: http://<server-url>/<mel-name>/web/index.html?open=<medianumber>
// Java Viewer:  http://<server-url>/<mel-name>/browser/open/<medianumber>
//
eL_name    = job.getWfKeyValue("EL_NAME");
server_url = job.getWfKeyValue("EL_SERVER");
url        = server_url + eL_name + '/web/index.html?open=' + job.index1;

xr.addDataField ("4", "2", "856");
// subfield u: URL
// subfield x: immer "D"
// subfield y: immer "elektronische Ressource eL"
xr.addSubField ("u", url);
xr.addSubField ("x", "D");
xr.addSubField ("y", "elektronische Ressource eL");

//
// datafield 936: befuelle aus index ind_Erscheinungsdatum (Erscheinungsdatum), wenn dieser
// nicht leer ist.
//
// ansonsten nimm index ind_Band (Band) und ind_Jahr (Jahr)
//

var date_str   = new String(job.index(ind_Erscheinungsdatum));
var date_year  = new String;
var date_month = new String;
var date_day   = new String;

//
// Zerlege den Index 9 in drei Teile, wenn moeglich...
//
pos_point      = date_str.indexOf('.');
pos_last_point = date_str.lastIndexOf('.');

if (pos_point > 0) {

  date_day = date_str.substring(0, pos_point).trim();

  if (pos_last_point > pos_point) {
     date_month = date_str.substring(pos_point + 1, pos_last_point).trim();
     date_year  = date_str.substring(pos_last_point + 1, date_str.length).trim();
  } // pos_last_point > pos_point

} // pos_point > 0...

if ((date_year.length > 0) || (date_month.length > 0) || (date_day.length > 0)) {

  //
  // Fall 1: index ind_Erscheinungsdatum ist vorhanden und es liessen sich Jahr/Monat/Tag (oder Teile) extrahieren ...
  //

  //
  // datafield 936: Band, Ausgabe, Seiten
  //
  xr.addDataField ("u", "w", "936");
  // subfield b: Tag
  // subfield c: Moant
  // subfield j: Jahr
  // subfield h: Seitenangabe
  xr.addSubField ("b", date_day);
  xr.addSubField ("c", date_month);
  xr.addSubField ("j", date_year);
  xr.addSubField ("h", job.index(ind_Seitenangabe));

} // date_year.length > 0...
else {

  //
  // Fall 2: Index 9 war leer, nimm nun Band und Jahr (Index 10/11)
  //

   var sl    = ut.split(job.index(ind_Band), '=');
   var band  = '';
   var monat = '';

   if (sl.length >= 2) {
    band  = ut.trimmed(sl[0]);
    monat = ut.trimmed(sl[1]);
   } else {
    band = ut.trimmed(job.index(ind_Band));
   }

  //
  // datafield 936: Band, Ausgabe, Seiten
  //
  xr.addDataField ("u", "w", "936");
  // subfield d: Ausgabe/Band
  // subfield c: Monatsangabe
  // subfield j: Jahr
  // subfield h: Seitenangabe
  if (band.length > 0)
     xr.addSubField ("d", band);
  if (monat.length > 0)
     xr.addSubField ("c", monat);
  xr.addSubField ("j", job.index(ind_Jahr));
  xr.addSubField ("h", job.index(ind_Seitenangabe));

} // date_year.length > 0...


//
// Speichern des XML-Ergebnisses in der KeyMap des Jobs unter 'Marc21XML'
//
job.setKeyValue("Marc21XML", xr.marc21XmlString());

//
// dies liefert den (hoffentlich) erzeugten XML-String als Ergebnis zurück
// und führt dazu, dass die Datei - wie im Transferziel angegegben - geschrieben wird...
//
xr.marc21XmlString();