Schlüssel (xsl:key
) sind eine Möglichkeit, um Transformationen über größere Dokumente mit vielen (internen oder externen) Verweisen zu beschleunigen. Im Sprachumfang von Schematron sind Daten-Schlüssel nicht enthalten, allerdings ist es sehr einfach, xsl:key
zu verwenden. Ein einfaches Beispiel: in einer Literaturliste verweisen die autor
-Elemente über das ref
-Attribut auf ein korrespondierendes person
-Element aus einer Liste:
<literatur> <buecher> <buch xml:id="b1"> <autor ref="p1">Mann, Thomas</autor> <titel>Der Zauberberg</titel> <isbn>978-3-596-29433-6</isbn> <href>http://d-nb.info/942764498</href> </buch> <buch xml:id="b2"> <autor ref="p2">Mann,Klaus</autor> <titel>Mephisto</titel> <isbn>3-10-046705-1</isbn> <href>http://d nb.info/959653694</href> </buch> <buch xml:id="b3"> <autor ref="b1"></autor> <titel></titel> </buch> </buecher> <autoren> <person xml:id="p1"> <vorname>Thomas</vorname> <nachname>Mann</nachname> </person> <person xml:id="p2"> <vorname>Klaus</vorname> <nachname>Mann</nachname> </person> </autoren> </literatur> |
Natürlich lässt sich die Referenz problemlos über XPath-Lokalisierungsschritte wie //person[@xml:id eq current()/@ref]
prüfen, aber eleganter und vermutlich schneller geht das mit Schlüsseln. Um xsl:key
in Schematron zu verwenden, muss das queryBinding
im äußersten schema
-Element auf xslt
(das ist ohnehin der Standardwert) oder xslt2
gesetzt und der XSL-Namespace deklariert werden, danach können xsl:key
-Elemente und die key()
-Funktion wie in XSLT verwendet werden:
<schema xmlns="http://purl.oclc.org/dsdl/schematron" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" queryBinding="xslt" > <xsl:key name="myKey" match="person" use="@xml:id"/> <pattern id="p3"> <rule context="autor"> <assert test="key('myKey', @ref)">[p3] autor/@ref muss auf ein person/@xml:id verweisen</assert> </rule> </pattern> </schema> |
Das assert
überprüft, ob jedes autor
-Element ein ref
-Attribut hat, und ob dieses ref
-Attribut auf ein person
-Element in der Autorenliste verweist. Entsprechend wird im obigen XML bei buch xml:id="b3"
die Referenz auf b1
als Fehler gemeldet.
xsl:key
-Elemente sollen im Schema vor dem ersten pattern
-Element stehen. Leider ist der Schematron-Standard diesbezüglich (und wie so oft) nicht sehr präzise; bei einem kurzen Test mit OxygenXML hat aber auch ein xsl:key
nach dem pattern
funktioniert.
XML-Beispiel und Schematron habe ich in der Beispielsammlung abgelegt.
Weblink
- Dave Pawson, Roger Costello, Florent Georges: ISO Schematron tutorial. Using keys for assertions (englisch)