<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Templating | FDMLab@LABW</title><link>https://fdmlab.landesarchiv-bw.de/tag/templating/</link><atom:link href="https://fdmlab.landesarchiv-bw.de/tag/templating/index.xml" rel="self" type="application/rss+xml"/><description>Templating</description><generator>Wowchemy (https://wowchemy.com)</generator><language>de-de</language><lastBuildDate>Sun, 01 May 2022 00:00:00 +0000</lastBuildDate><image><url>https://fdmlab.landesarchiv-bw.de/media/sharing.jpg</url><title>Templating</title><link>https://fdmlab.landesarchiv-bw.de/tag/templating/</link></image><item><title>Workshop - XML in OpenRefine importieren und exportieren</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/</guid><description>&lt;p>In diesem Tutorial beschäftigen wir uns mit dem Laden von XML in OpenRefine und dem Exportieren nach XML mit Templating.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Templating in der &lt;a href="https://docs.openrefine.org/manual/exporting#templating-exporter" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
Templating im &lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Recipes#12-templating-exporter" target="_blank" rel="noopener">OpenRefine Wiki&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>Die als &lt;a href="https://de.wikipedia.org/wiki/Extensible_Markup_Language" target="_blank" rel="noopener">XML&lt;/a> abgekürzte &amp;ldquo;Extensible Markup Language&amp;rdquo; kann sehr komplexe Datenformate abbilden. Von Textdokumenten über Grafikdaten zu Geodaten.
Im GLAM Bereich begegnet uns XML in Standards wie
&lt;a href="https://de.wikipedia.org/wiki/Encoded_Archival_Description" target="_blank" rel="noopener">EAD&lt;/a>,
&lt;a href="https://de.wikipedia.org/wiki/Metadata_Encoding_%26_Transmission_Standard" target="_blank" rel="noopener">METS&lt;/a>,
&lt;a href="https://de.wikipedia.org/wiki/Metadata_Object_Description_Schema" target="_blank" rel="noopener">MODS&lt;/a>,
&lt;a href="https://de.wikipedia.org/wiki/Records_in_Contexts" target="_blank" rel="noopener">RiC&lt;/a>,
&lt;a href="https://de.wikipedia.org/wiki/Text_Encoding_Initiative" target="_blank" rel="noopener">TEI&lt;/a>,
usw.&lt;/p>
&lt;p>Zur Abbildung der komplexen Strukturen in XML verwendet OpenRefine die im Workshop schon besprochenen &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/">Records&lt;/a>.
Damit können aber nur baumartige Strukturen abgebildet werden und keine komplexen Netzwerke.&lt;/p>
&lt;p>Um zu verstehen, wie OpenRefine XML einliest und ausgeben kann, verwenden wir exemplarisch ein einfaches Format.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;kabinett&lt;/span> &lt;span class="na">title=&lt;/span>&lt;span class="s">&amp;#34;Kretschmann III&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;person&lt;/span> &lt;span class="na">gnd-id=&lt;/span>&lt;span class="s">&amp;#34;143926683&amp;#34;&lt;/span> &lt;span class="na">sex=&lt;/span>&lt;span class="s">&amp;#34;m&amp;#34;&lt;/span> &lt;span class="na">birthday=&lt;/span>&lt;span class="s">&amp;#34;1948-05-17&amp;#34;&lt;/span> &lt;span class="na">birthplace=&lt;/span>&lt;span class="s">&amp;#34;Spaichingen&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>Kretschmann, Winfried&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;links&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;link&amp;gt;&lt;/span>http://dbpedia.org/resource/Winfried_Kretschmann&lt;span class="nt">&amp;lt;/link&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- ... --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/links&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- ... --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/kabinett&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das sind die Daten der Politiker des &lt;a href="https://de.wikipedia.org/wiki/Kabinett_Kretschmann_III" target="_blank" rel="noopener">Kabinetts Kretschmann III&lt;/a>, diesmal im XML Format. Die Personendaten sind teilweise in Attributen und teilweise als separates Element angelegt.
Die Links auf weitere &amp;ldquo;Profile&amp;rdquo; sind als Sammlung unterhalb des &lt;code>&amp;lt;person&amp;gt;&lt;/code> Elementes angelegt.&lt;/p>
&lt;h2 id="aufgabe-1-xml-laden">Aufgabe 1: XML Laden&lt;/h2>
&lt;p>Wir laden die folgende Datei in ein OpenRefine-Projekt.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/14_kretschmann-kabinett-iii.xml" target="_blank">
&lt;i class="fas fa-file-code pr-1 fa-fw">&lt;/i>Kretschmann III als XML&lt;/a>
&lt;p>Der Import von XML-Daten beginnt mit einem anderen Dialog, als wir es gewohnt sind.
Wie in Abbildung 1 gezeigt fragt OpenRefine nach dem ersten XML Element, welches als Record geladen werden soll.
Wir wählen hier das &lt;code>&amp;lt;person&amp;gt;&lt;/code> Element aus, da wir die Daten zu den Personen laden möchten.
Die restlichen Daten, wie zum Beispiel das &lt;code>&amp;lt;kabinett&amp;gt;&lt;/code> Element mit dem &lt;code>title&lt;/code> Attribut werden dann verworfen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-import-oberfläche-für-xml">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Import Oberfläche für XML." srcset="
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-import_hub68ca0a198a9ba6fdea2bf890ed56661_59629_15d6b92744221c3b6c74deb9da368e87.webp 400w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-import_hub68ca0a198a9ba6fdea2bf890ed56661_59629_18716695f0a9c08f1f476efdf5bc6fb9.webp 760w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-import_hub68ca0a198a9ba6fdea2bf890ed56661_59629_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-import_hub68ca0a198a9ba6fdea2bf890ed56661_59629_15d6b92744221c3b6c74deb9da368e87.webp"
width="724"
height="683"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Import Oberfläche für XML.
&lt;/figcaption>&lt;/figure>
&lt;p>In Abbildung 2 ist das Projekt direkt nach dem Import abgebildet.
Wir sind im &amp;ldquo;Record&amp;rdquo; Modus und aus jeder Person wurde ein &amp;ldquo;Record&amp;rdquo;.
Die Links sind auf mehrere Zeilen aufgeteilt.&lt;/p>
&lt;p>Interessant ist die automatische Benennung der Spalten:&lt;/p>
&lt;ul>
&lt;li>Das Attribut &lt;code>gnd-id&lt;/code> am Element &lt;code>&amp;lt;person&amp;gt;&lt;/code> wurde in die Spalte &lt;code>person - gnd-id&lt;/code> geladen.&lt;/li>
&lt;li>Das Element &lt;code>&amp;lt;name&amp;gt;&lt;/code> mit dem XML Pfad &lt;code>/kabinett/person/name&lt;/code> wurde in die Spalte &lt;code>person - name&lt;/code> geladen.&lt;/li>
&lt;li>Die Linksammlung mit dem XML Pfad &lt;code>/kabinett/person/links/link&lt;/code> wurde in die Spalte &lt;code>person - links - link&lt;/code> geladen.&lt;/li>
&lt;/ul>
&lt;figure id="figure-bildschirmfoto-der-geladenen-xml-datei">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der geladenen XML Datei." srcset="
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-start_hud2e2e10fae61fe40f219846af80f3846_50695_27515dcadc0361818f30b6312278dee0.webp 400w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-start_hud2e2e10fae61fe40f219846af80f3846_50695_fd3893a6ef9371f5e8f7e4d813335f5f.webp 760w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-start_hud2e2e10fae61fe40f219846af80f3846_50695_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-start_hud2e2e10fae61fe40f219846af80f3846_50695_27515dcadc0361818f30b6312278dee0.webp"
width="760"
height="365"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der geladenen XML Datei.
&lt;/figcaption>&lt;/figure>
&lt;p>Durch diese automatische Benennung lässt sich nachvollziehen, woher die Daten stammen und wie sie zusammengehören.
Es bedeutet aber auch, dass wir die Spalten alle manuell umbenennen müssen.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Benennen Sie die Spalten wie in Abbildung 3 gezeigt um.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-mit-korrekten-spaltennamen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes mit korrekten Spaltennamen." srcset="
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-renamed_hufcdef497729b518629de2905303bd53f_49468_3e48c0deba710bf565c9d08e411f7e35.webp 400w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-renamed_hufcdef497729b518629de2905303bd53f_49468_fd1cc8a58a1085a1d483faaf96a030d6.webp 760w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-renamed_hufcdef497729b518629de2905303bd53f_49468_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-renamed_hufcdef497729b518629de2905303bd53f_49468_3e48c0deba710bf565c9d08e411f7e35.webp"
width="760"
height="406"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes mit korrekten Spaltennamen.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-2-xml-exportieren-einfach">Aufgabe 2: XML exportieren (einfach)&lt;/h2>
&lt;p>Theoretisch könnten wir die Daten im Projekt jetzt mit weiteren Daten anreichern, umformatieren&amp;hellip;
Diesen Part überspringen wir und beschäftigen uns direkt damit, wie wir die Daten wieder als XML exportieren können.&lt;/p>
&lt;p>Unser Zielformat sieht wie in folgendem Beispiel aus:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;gnd-id&amp;gt;&lt;/span>143926683&lt;span class="nt">&amp;lt;/gnd-id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>Kretschmann, Winfried&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geschlecht&amp;gt;&lt;/span>m&lt;span class="nt">&amp;lt;/geschlecht&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtstag&amp;gt;&lt;/span>1948-05-17&lt;span class="nt">&amp;lt;/geburtstag&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtsort&amp;gt;&lt;/span>Spaichingen&lt;span class="nt">&amp;lt;/geburtsort&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- ... --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wir wollen also die Personendaten in einzelne Elemente speichern und erstmal auf die Links verzichten.
Dafür wechseln wir in OpenRefine in den &amp;ldquo;Rows&amp;rdquo; Modus und filtern die zusätzlichen Link Zeilen via
&amp;ldquo;GND-ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Customized facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facet by blank (null or empty string)&amp;rdquo;.&lt;/p>
&lt;p>Anschließend gehen wir auf &amp;ldquo;Export&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Templating&amp;hellip;&amp;rdquo; um den in Abbildung 4 gezeigten Dialog aufzurufen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-templating-dialogs-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Templating Dialogs in OpenRefine." srcset="
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-templating-json_hu9aa3c20899dacfb530f00a48cd76d281_43814_eea2c3f7d0fa044d576a8849450c274d.webp 400w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-templating-json_hu9aa3c20899dacfb530f00a48cd76d281_43814_0a5162ccabae8a3eb82f5232055a7509.webp 760w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-templating-json_hu9aa3c20899dacfb530f00a48cd76d281_43814_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-templating-json_hu9aa3c20899dacfb530f00a48cd76d281_43814_eea2c3f7d0fa044d576a8849450c274d.webp"
width="760"
height="575"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Templating Dialogs in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Dieser Dialog besteht aus fünf Teilen:&lt;/p>
&lt;ol>
&lt;li>Das &amp;ldquo;Prefix&amp;rdquo;, also der Text, der zu Beginn steht.&lt;/li>
&lt;li>Das &amp;ldquo;Row Template&amp;rdquo;, also das Template für die einzelnen Zeilen.&lt;/li>
&lt;li>Der &amp;ldquo;Row Separator&amp;rdquo;, also das Trennzeichen zwischen den einzelnen Zeilen.&lt;/li>
&lt;li>Das &amp;ldquo;Suffix&amp;rdquo;, also der Text, der am Ende steht.&lt;/li>
&lt;li>Eine Vorschau auf der rechten Seite.&lt;/li>
&lt;/ol>
&lt;p>Initial wird ein Template zum Erzeugen von JSON geladen.
Im Template Feld sind GREL-Ausdrücke in geschweiften Klammern &lt;code>{{...}}&lt;/code> zu sehen, die die Werte in den einzelnen Feldern mit der Funktion &lt;code>jsonize()&lt;/code> in ein kompatibles Format umwandeln.&lt;/p>
&lt;p>Für die Generierung von XML gehen wir ähnlich vor.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Die Vorschau ist teilweise recht aufwendig zu berechnen.
Sollte es zu lange dauern, bis sie geladen wird, kann man die GREL-Ausdrücke in einem anderen Dialog-Fenster (zum Beispiel &amp;ldquo;Edit cells&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Transform&amp;rdquo;) testen und/oder zum Entwickeln die Anzahl an Einträgen via Facet (zum Beispiel &amp;ldquo;Facet by star&amp;rdquo;) reduzieren.
&lt;/div>
&lt;/div>
&lt;h3 id="prefix">Prefix&lt;/h3>
&lt;p>Zu Beginn benötigen wir die XML Deklaration und das Wurzelelement &lt;code>&amp;lt;personen&amp;gt;&lt;/code>, welche wir in das Feld &amp;ldquo;Prefix&amp;rdquo; schreiben.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="suffix">Suffix&lt;/h3>
&lt;p>Das Wurzelelement schließen wir im Feld &amp;ldquo;Suffix&amp;rdquo; und fügen davor zur besseren Lesbarkeit noch eine Leerzeile (Zeilenumbruch) hinzu.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="row-separator">Row Separator&lt;/h3>
&lt;p>Um die einzelnen Zeilen zu separieren verwenden wir ebenfalls eine Leerzeile (Zeilenumbruch).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="row-template">Row Template&lt;/h3>
&lt;p>Der aufwendigste Part ist die Erstellung eines Templates für die einzelnen Zeilen im Feld &amp;ldquo;Row Template&amp;rdquo;.
Hierfür können wir in einem ersten Versuch die Vorlage des Zielformates in das Feld kopieren und die einzelnen Werte mit Variablen (Spaltenname) versehen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;gnd-id&amp;gt;&lt;/span>${GND-ID}&lt;span class="nt">&amp;lt;/gnd-id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>${Name}&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geschlecht&amp;gt;&lt;/span>${Geschlecht}&lt;span class="nt">&amp;lt;/geschlecht&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtstag&amp;gt;&lt;/span>${Geburtstag}&lt;span class="nt">&amp;lt;/geburtstag&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtsort&amp;gt;&lt;/span>${Geburtsort}&lt;span class="nt">&amp;lt;/geburtsort&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die Variante mit Variablen funktioniert und ist gut zu lesen. Sie hat jedoch den Nachteil, dass einzelne Sonderzeichen in den Feldern (&lt;code>&amp;lt;&lt;/code> oder &lt;code>&amp;gt;&lt;/code> ) die Struktur des XML Dokumentes zerstören können.
Um das zu verhindern, gibt es in GREL die Funktion &lt;a href="https://docs.openrefine.org/manual/grelfunctions#escapes-s-mode" target="_blank" rel="noopener">escape()&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Schreiben sie die Vorlage so um, dass statt der Variablen analog zu dem JSON Template GREL Ausdrücke mit &lt;code>escape()&lt;/code> verwendet werden.&lt;/p>
&lt;details class="spoiler " id="spoiler-12">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;gnd-id&amp;gt;&lt;/span>{{escape(cells[&amp;#34;GND-ID&amp;#34;].value, &amp;#34;xml&amp;#34;)}}&lt;span class="nt">&amp;lt;/gnd-id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>{{escape(cells[&amp;#34;Name&amp;#34;].value, &amp;#34;xml&amp;#34;)}}&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geschlecht&amp;gt;&lt;/span>{{escape(cells[&amp;#34;Geschlecht&amp;#34;].value, &amp;#34;xml&amp;#34;)}}&lt;span class="nt">&amp;lt;/geschlecht&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtstag&amp;gt;&lt;/span>{{escape(cells[&amp;#34;Geburtstag&amp;#34;].value, &amp;#34;xml&amp;#34;)}}&lt;span class="nt">&amp;lt;/geburtstag&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtsort&amp;gt;&lt;/span>{{escape(cells[&amp;#34;Geburtsort&amp;#34;].value, &amp;#34;xml&amp;#34;)}}&lt;span class="nt">&amp;lt;/geburtsort&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-3-xml-exportieren-records">Aufgabe 3: XML exportieren (Records)&lt;/h2>
&lt;p>In Aufgabe 2 haben wir die Baumstruktur des Dokumentes ignoriert, also die Links weggelassen.
Diesmal wollen wir die Links jedoch mit ausgeben.
Dafür deaktivieren wir das in Aufgabe 2 erstellte Facet und wechseln in den &amp;ldquo;Record&amp;rdquo; Modus.&lt;/p>
&lt;p>Unser Zielformat sieht wie folgt aus:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;gnd-id&amp;gt;&lt;/span>143926683&lt;span class="nt">&amp;lt;/gnd-id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>Kretschmann, Winfried&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geschlecht&amp;gt;&lt;/span>m&lt;span class="nt">&amp;lt;/geschlecht&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtstag&amp;gt;&lt;/span>1948-05-17&lt;span class="nt">&amp;lt;/geburtstag&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtsort&amp;gt;&lt;/span>Spaichingen&lt;span class="nt">&amp;lt;/geburtsort&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;links&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;link&amp;gt;&lt;/span>http://dbpedia.org/resource/Winfried_Kretschmann&lt;span class="nt">&amp;lt;/link&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- ... --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/links&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- ... --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Es unterscheidet sich also lediglich durch das zusätzliche Element &lt;code>&amp;lt;links&amp;gt;&lt;/code>.&lt;/p>
&lt;p>Leider gibt es bei den Vorlagen in OpenRefine keine direkte Unterstützung von &amp;ldquo;Records&amp;rdquo;, so dass wir uns mit GREL behelfen müssen.
Wir bauen also das komplette Template durch eine Verkettung von Textschnippseln in GREL zusammen.
Dafür verwenden wir die Kontrollstrukturen &lt;a href="https://docs.openrefine.org/manual/grel#ife-etrue-efalse" target="_blank" rel="noopener">if&lt;/a> und &lt;a href="https://docs.openrefine.org/manual/grel#foreache1-v-e2" target="_blank" rel="noopener">forEach&lt;/a>.&lt;/p>
&lt;p>Hier ist die allgemeine Idee für unseren Algorithmus:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Wir verarbeiten immer nur die erste Zeile eines Records.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">index&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">fromRowIndex&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;person&amp;gt;\n&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">...&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/person&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Wir geben alle Spalten mit nur einer gefüllten Zeile im Record direkt aus.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;lt;gnd-id&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;GND-ID&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/gnd-id&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Wir zählen Spalten mit mehr als einer Zeile im Record zeilenweise mit &lt;code>forEach&lt;/code> auf.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Links&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">link&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;link&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">link&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/link&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Erstellen Sie mit GREL ein Template, welches zusätzlich zu den Daten aus Aufgabe 1 auch die Links mit ausgibt.
&lt;details class="spoiler " id="spoiler-13">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">index&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">fromRowIndex&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;lt;person&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;gnd-id&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;GND-ID&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/gnd-id&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;name&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Name&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;lt;/name&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;geschlecht&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geschlecht&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/geschlecht&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;geburtstag&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtstag&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/geburtstag&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;geburtsort&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsort&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/geburtsort&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;links&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Links&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">link&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;link&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">link&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/link&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;\n&amp;lt;/links&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/person&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Hinweis:&lt;/strong> Wir verzichten in diesem GREL Ausdruck auf Leerzeichen zur Formatierung des XML zur Einrückung der einzelnen Elemente.
Wir haben die Erfahrung gemacht, dass die Lesbarkeit der GREL Ausdrücke darunter leidet.
Einfacher ist es, bei Bedarf das XML anschließend in einem Editor wie &lt;a href="https://notepad-plus-plus.org/" target="_blank" rel="noopener">Notepad++&lt;/a> oder &lt;a href="https://code.visualstudio.com/" target="_blank" rel="noopener">Visual Studio Code&lt;/a> mit den entsprechenden XML Erweiterungen automatisch formatieren und dabei auch gleich noch validieren zu lassen.&lt;/p>
&lt;/p>
&lt;/details>&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Wir haben für diesen Workshop bewusst ein einfach strukturiertes XML Beispiel erstellt um direkt zu sehen, wie OpenRefine die XML Struktur verarbeitet und XML erstellen kann.
Üblicherweise sind XML Dateien weitaus tiefer strukturiert und es dauert entsprechend länger, bis die Daten in OpenRefine passend benannt und sortiert sind.
Auch der Export ist oft weitaus komplexer, zum Beispiel wenn Felder optional leer sein können oder es mehrere Verschachtelungen in den Records gibt.
Jedoch sind die Strategien zur Lösung dieser Probleme (&amp;ldquo;Sortieren &amp;amp; Umbenennen&amp;rdquo; bzw. &amp;ldquo;&lt;code>if&lt;/code> und &lt;code>forEach&lt;/code>&amp;rdquo;) die gleichen wie hier im Beispiel besprochen.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit dem erweiterten Datenabgleich zwischen OpenRefine und der Gemeinsamen Normdatei via des lobid API.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid" class="btn btn-primary px-3 py-3">15 Erweiterter GND Abgleich mit lobid&lt;/a>
&lt;/li>
&lt;/ul></description></item></channel></rss>