Variablen

(Auszug aus "Schematron - Effiziente Business Rules für XML-Dokumente", Kapitel 7)

Das wichtigste Instrument für eine kompaktere Programmierung ist der Einsatz von Variablen mit dem Element <let>.

Eine Variable besteht immer aus einem Namen und dem dazugehörigen Wert. Der Wert kann bei der Deklaration der Variablen zugewiesen werden – bei Schematron mittels XPath. Die Variable hat immer einen vom Ort der Definition abhängigen, begrenzten Scope. Innerhalb dieses Scopes kann auf die Variable mittels des Namens referenziert werden.

Variablendeklaration

Zur Deklaration von Name und Wert erhält das Element <let> die beiden Attribute name und value. Dem Attributnamen entsprechend definiert name mit einem String den Variablennamen und value mittels XPath-Anweisung den Variablenwert:

<schema xmlns="http://purl.oclc.org/dsdl/schematron"> 
  <ns uri="http://www.schematron.info/arche" prefix="arc"/> 
  <let name="nutzlast" value="sum(//arc:gewicht)"/>         (1) 
  […] 
</schema> 

(1) Hier wird der Variable nutzlast der Inhalt des Elementes <nutzlast> zugewiesen.

Das <let>-Element darf außer im <schema>-Element auch innerhalb der Elemente <Pattern>, <phase> und <rule> vorkommen. Sinnvoll ist vor allem die Verwendung einer Variablen im <rule>-Element, da hier die Besonderheit gilt, dass der XPath-Ausdruck auch relativ angegeben werden darf. Hier geht die XPath-Anweisung vom jeweiligen Kontextknoten der Regel aus. So wird bei jedem Knoten, der als Kontextknoten der Regel ausgewählt wird, ein neuer Wert – abhängig vom Kontext – für die Variable bestimmt.

<rule context="arc:tier"> 
  <let name="art" value="arc:art"/> 
  <report  test="count(//arc:tier[arc:art=current()/arc:art]) &gt; 2">In der  Arche gibt es mehr als zwei Tiere der Art <value-of  select="arc:art"/>.</report> 
</rule> 

Je nach Kontextknoten nimmt die Variable den Inhalt des arc:tier/arc:art-Elements an. Bei einem Zebra also den String Zebra, bei einem Löwen den String Löwe usw.

Variablenabruf

In XPath-Ausdrücken werden Variablen mit dem $-Zeichen vor dem Variablennamen abgerufen, also: $variablenname.

<rule context="arc:tier"> 
  <let name="art" value="arc:art"/> 
  <report test="count(//arc:tier[arc:art=$art])  &gt; 2">In der Arche gibt es mehr als zwei Tiere der Art  <value-of select="$art"/>.</report>   (1) 
</rule> 

(1) Jeder Teilausdruck, der auf das <art>-Element (des Kontextknotens) zugegriffen hat, kann nun durch den Variablenzugriff $art ersetzt werden. Durch diese Substitution bleibt die Funktionsweise des Tests unverändert.

Die obige Regel unterscheidet sich allerdings kaum von einem Code, bei dem keine Variable verwendet wurde. Es sind sogar mehr Zeichen geworden! Für Erweiterungen oder Änderungen des Schemas ist diese Version allerdings vorteilhafter. Angenommen, der Zugriff auf das Element <art> ändert sich. Eine zentrale Korrektur bei der Variablendefinition kann dieses Problem leicht beheben. Ohne Variable müsste jeder Teilausdruck einzeln korrigiert werden.

Scope einer Variablen

Auf eine Variable kann nur innerhalb desjenigen Elementes zugegriffen werden, in dem die Variable deklariert wurde. Eine Variable, die im Top-Level-Element deklariert wurde, ist folglich im gesamten Schematron-Schema gültig. Ist die Variable aber in einem <rule>-Element definiert, gilt diese nur für die entsprechende Regel. Tatsächlich jedoch gibt es – zumindest bei der Verwendung des Skeletons – mehrere Ausnahmen: Variablen in <pattern>-Elementen werden als Top-Level-Variablen behandelt. Zudem können Variablen, die nur für Regeln gültig sind, auch in den dort referenzierten <diagnostic>-Elementen oder – wie wir später sehen werden – in den referenzierten abstrakten Regeln verwendet werden.

Hintergrundinformationen für XSLT-Profis: Warum diese Ausnahmen?

Tatsächlich werden beim Transformationsprozess des Schematron-Schemas alle <let>-Elemente in entsprechende <xsl:variable>-Elemente umgewandelt. Aus

<let name="art" value="arc:art"/>

wird

<xsl:variable name="art" select="arc:art"/>

Jedoch wandelt sich bei der Transformation auch die Struktur des Schematron-Schemas. So gibt es keinen entsprechenden Container in XSLT, in den das <pattern>-Element umgewandelt wird. Die Gliederung erfolgt über unterschiedliche Modi der Templates. Da aber eine solche Gliederung bei Variablen nicht möglich ist, müssen diese im entsprechenden XSLT-Stylesheet als Top-Level-Variablen definiert werden. Regeln dagegen werden in <xsl:template>-Elemente umgewandelt und die gegebenenfalls dazugehörigen <let>-Elemente zu <xsl:variable>-Elementen.

Die <diagnostic>-Elemente und abstrakten Regeln erhalten ihre Zugriffsberechtigung auf Variablen dadurch, dass sie bei der Transformation in die Templates der entsprechenden Regel integriert werden. So wird auch der Kontextknoten der Regel für den Lösungsvorschlag gültig.

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Schematron bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © dpunkt.verlag GmbH 2011
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken. Ansonsten unterliegt dieses Kapitel aus dem Buch "Schematron - Effiziente Business Rules für XML-Dokumente" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

dpunkt.verlag GmbH, Ringstraße 19B, 69115 Heidelberg, fon 06221-14830, fax 06221-148399, hallo(at)dpunkt.de