2020.06

Die Nutzung von XSLT 3

Der Abschnitt beschreibt die Nutzung von XSLT 3 zur Transformation von Layouts und Daten sowie die zusätzlichen MyCoRe-Funktionen

Einbindung von Saxon in die MyCoRe-Transformationen

In MyCoRe ist es möglich, gekapselte Transformationsprozesse, z. B. für Datenexporte, generieren von PDF-Dateien u. ä. bereits auf XSLT 3 schrittweise umzustellen, ohne dies schon für die Gesamtanwendung tun zu müssen. Saxon ist dabei das Mittel der Wahl. Um einen Transformationsprozess umzustellen, sind folgende Konfigurationen notwendig.

1
2
3
  MCR.ContentTransformer.{my_process}.Class=org.mycore.common.content.transformer.MCRXSLTransformer
  MCR.ContentTransformer.{my_process}.Stylesheet=xsl/{my_stylesheet}.xsl
  MCR.ContentTransformer.{my_process}.TransformerFactoryClass=net.sf.saxon.TransformerFactoryImpl

Wird die TransformerFactoryClass nicht gesetzt, ist Xalan der Fallback. Unabhängig davon kann durch Konfiguration auch die Gesamte Anwendung schon auf XSLT 3 umgestellt werden, wenn dies alle Transformations-Stylesheets unterstützen.

Zusätzliche XSLT 3 Funktionen aus MyCoRe

MyCoRe bietet für die Integration interner Funktionen für XSLT3 eine Alternative zum URI-Resolver. Diese Funktionen werden im Folgenden beschrieben. Jedes der angegebenen Stylesheets muss dabei inkludiert werden. Weiterhin muss jeweils ein Namespace definiert werden.

I18N Integration

MyCoRe-Komponente : mycore-base
Stylesheet : xsl/functions/i18n.xsl
Namespace : xmlns:mcri18n="http://www.mycore.de/xslt/i18n"

Für die Integration von I18N-properties sind zwei XSLT-Funktionen konzipiert. Die erste Funktion enthält als Argument nur den String des einzelnen Properties. In der zweiten Variante können der Transformation auch zusätzliche Argumente mit gegeben werden.

1
2
3
  <xsl:value-of select="mcri18n:translate({i18n_property_string})" />

  <xsl:value-of select="mcri18n:translate-with-params({i18n_property_string}, ({arg_1}, ...))" />

Hier die Beispiele dazu

1
2
3
  <xsl:value-of select="mcri18n:translate('my_message_string')" />

  <xsl:value-of select="mcri18n:translate-with-params('my_message_string_with_args', ('arg_1', 'arg_2'))" />

Test der Zugriffsrechte

MyCoRe-Komponente : mycore-base
Stylesheet : xsl/functions/acl.xsl
Namespace : xmlns:mcracl="http://www.mycore.de/xslt/acl"

Es wurde eine XSLT Funktion konzipiert, welche die Zugriffsrechte für Objekte und Permissions testet und eine boolschen Wert als Ergebnis zurückgibt. mcracl:check-permission liefert ein Boolean zurück und hat zwei Parameter ‚id‘ und ‚permission‘, dabei kann id auch die leere Sequenz sein - () .

1
2
  mcracl:check-permission({id}, {permission})
  mcracl:check-permission((), {permission})

Hier die Beispiele dazu

1
2
  mcracl:check-permission(‚mir_mods_00004711‘, ‚delete‘)
  mcracl:check-permission((), ‚create-mods')

Umwandeln von Klassifikationseinträgen in eine MODS-URI und umgekehrt

MyCoRe-Komponente : mycore-mods
Stylesheet : xsl/functions/mods.xsl
Namespace : xmlns:mcrmods="http://www.mycore.de/xslt/mods"

mcrmods:mcrmods:to-uri() liefert für ein Element (per XPath) eine (‚modsclass:‘)-URI zurück, wenn das Element eine Klassifikationsangabe hat (z.B. über @authorityURI und @valueURI). Diese Funktion wird hauptsächlich interne gebraucht.

Hier ein Beispiel dazu

1
  mcrmods:to-uri($node)

mcrmods:to-mycoreclass() liefert eine MyCoRe-Klassifikations-XML-Auschnitt zurück für ein Element (1. Parameter) und einen mode (2. Parameter). Der erste Parameter ist ein MODS-Element, das ggf. eine Klassifikationsangabe enthält (s.o.) und der zweite Parameter kann entweder ‚parent‘ oder ’single’ sein. Bei ‚parent‘ werden alle Elternkategorien mit ausgeliefert (die gesuchte Kategorie ist also die, die keine Kinder mehr enthält) und bei ’single’ gibt es nur die gewünschte Kategorie mit allen Labels zurück eingebettet in den üblichen ‚mycoreclass‘-Container

Hier ein Beispiel dazu

1
  mcrmods:to-mycoreclass(mods:classification, 'parent')

mcrmods:is-supported() gibt true für ein Element (s.o.) zurück, wenn es prinzipiell geeignet ist eine Klassifikationsangabe zu enthalten. Das ist auch eine Hilfsfunktion und wird hauptsächlich intern benutzt.

Hier die Beispiele dazu

1
2
  mcrmods:is-supported(mods:classification)  —> IMMER true
  mcrmods:is-supported(/mycoreobject)  —> IMMER false

Weiterhin gibt es noch ein XSL-Template das mit mode=‚parent* auf mycoreclass-Elemente matched und auch nur intern verwendet wird.