Über ein Jahr lang hat das Kochbuch treue Dienste geleistet – aber (schnief!) es hat sich nicht weiterentwickelt. Der Bau des Hauses hat alle Zeit aufgefressen. Nun endlich sieht es so aus, als ob es ab und an wieder einige zusammenhängende Stunden gibt, die für das Kochbuch genutzt werden können.
Eigentlich – es gibt kein geheimnisvolleres Wort als "eigentlich" – wollte ich mich in diesen zusammenhängenden Stunden bevorzugt meinem neuen Projekt "fruschtique graphLab" widmen, das ich in den beiden vorangehenden Posts ansatzweise beschrieben habe. In der Tat hat es da auch einigen Fortschritt gegeben, der sogar von Maria mit einiger Bewunderung zur Kenntnis genommen wurde. Was ich "graphLab" nenne, nennt sie "Böppelbilder", und Du, liebe Leserin, wirst leider noch ein bisschen darauf warten müssen.
In der Zwischenzeit quäle ich Dich mit einer anderen meiner Marotten: der semantischen Annotation von Webseiten.

Für die semantische Annotation von Webseiten kommt man meiner Meinung nach nicht an schema.org nicht vorbei. schema.org ist keine formale Ontologie im Sinne einer Beschreibungslogik bzw. im Sinne einer darauf aufbauenden Ontologiesprache wie z.B. OWL. Am besten könnte man schema.org meiner Meinung nach als kontrolliertes Vokabular zur Beschreibung des Inhalts von Webseiten charakterisieren, kontrolliert von Google und einigen anderen Größen des World Wide Web. Da Rezepte im WWW keine zu vernachlässigende Rolle spielen, enthält schema.org eine ausführliche Sammlung von Begriffen, mit denen sich Rezepte beschreiben lassen; man findet diese Begriffssammlung hier. (Selbstkritische Randbemerkung: Vielleicht wäre es besser gewesen, wenn auch ich die schema.org-Begriffe für die Entwicklung meines XML-Schemas für Rezepte verwendet hätte, möglicherweise unter Einbringung einiger Erweiterungen. Leider habe ich das nicht getan, und vor einer nachträglichen Umstellung fürchte ich mich erbärmlich.)
Was also ist zu tun? Zwei Aufgaben sind zu erledigen:
- Zum einen muss ich eine Abbildung zwischen meinen Begriffen und den schema.org-Begriffen herstellen. Vorweg: Bei vielen Begriffen gelingt das leicht, aber es gibt diverse Begriffe, die es jeweils nur in der einen "Welt" gibt, in der anderen aber nicht. Ich habe mich dazu entschieden, nur die offensichtlichen Begriffsabbildungen zu implementieren, z.B. von recipeIntro (fruschtique) nach description (schema.org). Ich werde dieses Thema im folgenden nicht weiter verfolgen.
- Ich muss die gewünschten semantische Annotation in einem geeigneten Format bereitstellen. Das Quellformat für meine Rezepte ist XML. XML tags (präziser: die tag names) kann man ohne Mühe als semantische Beschreibung der text values derzugehörigen XML-Elemente auffassen. Schema.org sieht für die semantische Annotation von HTML-codierten Rezepten eines dieser drei Non-XML-Formate vor: microdata, RDFa oder JSON-LD. Es wird also eine Umcodierung der in den Rezeptdaten enthaltenen semantischen Informationen vom XML-Format in eines der drei genannten Formate benötigt. Ich habe mich für JSON-LD entschieden (die JavaScript Object Notation for Linking Data), da hier HTML-codierter Rezepttext und semantische Annotation klar voneinander getrennt werden.
Nun können wir die Aufgabe präzise beschreiben: Es besteht die Aufgabe, den text value derjenigen XML-Elemente, für deren tags es eine Entsprechung in der Begriffswelt von schema.org/recipe gibt, unter Verwendung der schema.org-Begriffe in das JSON-LD-Format einzupacken, z.B. in die für JSON typischen key-value pairs (die im Jargon als map bezeichnet werden). Stark vereinfacht: Die Entsprechung des tag name eines XML-Elements wird zum JSON key, der text value des XML-Elements wird zum JSON value. Der erfahrene XSLT-Programmierer sagt sich: Kein Problem – und krempelt die Ärmel hoch. Bald darauf stellt er fest: Mit Hilfe eines XSLT-Stylesheet einen Text zu erzeugen, der später als JSON-Dokument mit all den erforderlichen Anführungszeichen, Klammern und Kommas durchgehen kann, ist nicht lustig – und weder das Stylesheet, noch das resultierende JSON-Dokument sind besonders übersichtlich; von "hübsch" mag man gar nicht reden.
Also: neue Recherche.
Und: Oh Wunder! XSLT 3.0 schenkt uns eine Funktion xml-to-json() – und damit sollte es doch ganz leicht gehen!
Doch nichts ist ohne Preis: Die xml-to-json()-Funktion erwartet als XML-Input eine Instanz dieses XML-Schemas. Es hat den target namespacehttp://www.w3.org/2005/xpath-functions, und ist ebenso wie die Spezifikation der xml-to-json()-Funktion in der W3C Recommendation: XSL Transformations (XSLT) Version 3.0 vom 8.6.2017 enthalten. (Naja, dieses Datum sagt mir, dass ich, wenn ich mich bereits
zu der Zeit, als ich das Kochbuch zum ersten Mal veröffentlicht habe, mit der semantischen
Annotation meiner Rezepte beschäftigt hätte, möglicherweise einen Frühschuss getan
hätte.) Das xml-to-json-Input-Format hat leider gar nichts mit meinem Rezept-Schema zu tun. Es ähnelt eher
einer XML-basierten Beschreibung des oben andiskutierten JSON-Formats mit maps, arrays usw.
Der erfahrene XSLT-Programmierer krempelt also zum zweiten Male die Ärmel hoch.
Dieses Mal klappt es. In meinem Stylesheetgen_json-ld.xsl befülle ich zunächst eine XSLT-Variable mit einer XML-Baumstruktur, die dem xml-to-json-Schema genügt und die text values der entsprechenden XML-Elemente aufnimmt, und transformiere dann diese Baumstruktur
mit der xml-to-json()-Funktion in das JSON-Format. Das Ergebnis der Transformation ist das gewünschte Output-Dokument.
Das Stylesheetgen_json-ld.xsl inkludiere ich in das übergeordnete Stylesheetgen_rcp.xsl. Dieses sorgt dafür, dass in den Kopf eines jedes HTML-codierten Rezepts die passende
JSON-LD-codierte semantische Annotation gelangt und in script tags eingeschlossen wird. Das Stylesheet gen_rcp.xsl wird selber wiederum in das Stylesheet book-builder.xsl inkludiert.
War doch gar nicht schwer. Oder?
Selbstverständlich habe ich die von mir erzeugten semantischen Annotationen mit Hilfe des Google-Testtool für strukturierte Daten syntaktisch überprüft.
Aber nun ist doch wirklich alles dafür getan (heul!), dass Google das fruschtique-Kochbuch mit lauter ersten Plätzen in den Trefferlisten der Rezeptsuche bedenkt! Damit Du, liebe Leserin, dazu verführt wirst, niemals eine andere Sultanrolle zu kochen als meine!



