XSL-Übersicht / xsl:import-schema

xsl:import-schema

xsl:import-schema

xsl:import-schema bindet XML-Schema-Validierung in den XSL-Transformationsprozess ein.

Die Notwendigkeit zu sorgfältiger XML-Validierung hatte ich bereits besprochen. Neben einer XML-Schema-Validierung, die der XSL-Transformation vorgeschaltet ist (sodass die XSL-Transformation nicht beginnt, wenn die Validierung fehlschlägt), gibt es noch die Alternative, eine XML-Schema-Validierung während des laufenden XSL-Transformationsprozesses durchzuführen. Das ist vorteilhaft nicht zuletzt bei der Kontrolle komplexer Variablen.

Dazu benötigen Sie zunächst ein XML-Schema, das die Struktur der XML-Elemente, XML-Attribute und simplen Typen definiert.


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element 
            ref="m" 
            minOccurs="0" 
            maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="m" type="CTattribute"/>
  <xs:complexType name="CTattribute">
    <xs:attribute name="vn" type="stringmax20"/>
    <xs:attribute name="nn" type="stringmax20"/>
    <xs:attribute name="wo" type="stringmax20"/>
  </xs:complexType>
  <xs:simpleType name="stringmax20">
    <xs:restriction base="xs:string">
      <xs:minLength value="2"/>
      <xs:maxLength value="20"/>
      <xs:pattern value="[A-Z][a-z]*"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

Nehmen Sie an, Sie haben in Ihrem XSL-Stylesheet eine temporäre Variable v mit dem folgenden Inhalt generiert. Noch während des XSL-Transformationsprozesses möchten Sie prüfen, ob v valide ist gegen das vorgegebene XML-Schema. Das ist möglich durch xsl:validation='strict'. Das setzt aber voraus, dass der verwendete auch schema-aware ist.


<xsl:variable name="v">
  <root xsl:validation="strict">
    <m vn="Hugo"   nn="Holzflos"  wo="Neustadt"/>
    <m vn="Nicole" nn="Nixlos"    wo="Neustadt"/>
    <m vn="Stefan" nn="Sprachlos" wo="Neustadt"/>
    <m vn="Stefan" nn="Sagblos"   wo="Neustadt"/>
    <m vn="Siggi"  nn="Sorglos"   wo="Neustadt"/>
    <m vn="Heini"  nn="Herzlos"   wo="Neustadt"/>
    <m vn="Rudi"   nn="Rhodos"    wo="Darmstadt"/>
    <m vn="Karl"   nn="Kolos"     wo="Darmstadt"/>
    <m vn="Simone" nn="Sinnlos"   wo="Darmstadt"/>
    <m vn="Horst"  nn="Hirnlos"   wo="Darmstadt"/>
    <m vn="Werner" nn="Wertlos"   wo="Darmstadt"/>
    <m vn="Ludwig" nn="Lustlos"   wo="Darmstadt"/>
    <m vn="Willi"  nn="Wasistlos" wo="Kapstadt"/>
    <m vn="Rita"   nn="Ruhelos"   wo="Kapstadt"/>
    <m vn="Susi"   nn="Schlaflos" wo="Kapstadt"/>
    <m vn="Lotte"  nn="Rielos"    wo="Kapstadt"/>
    <m vn="Betty"  nn="Bodenlos"  wo="Kapstadt"/>
    <m vn="Martin" nn="Muehelos"  wo="Kapstadt"/>
    <m vn="Liane"  nn="Leinenlos" wo="Kapstadt"/>
  </root>
</xsl:variable>

Dieser Ansatz funktioniert analog auch mit xsl:document:


<xsl:variable name="v">
  <xsl:document validation="strict">
   <root>
    ...
   </root>
  </xsl:document>
</xsl:variable>

Befindet sich das XML-Schema in einer externen Datei (zum Beispiel "../xsd/xsd_root_m.xsd"), so können Sie diese mit xsl:import-schema und dessen Attribut schema-location einfach einbinden.


<xsl:stylesheet 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     exclude-result-prefixes="xs"
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     version="3.0">
  <xsl:output method="xml" indent="yes"/>
 <xsl:import-schema 
      schema-location="../xsd/xsd_root_m.xsd" 
      use-when="system-property('xsl:is-schema-aware') eq 'yes'"/>
 <xsl:template match="/">        
     <xsl:copy-of select="$v"/>
 </xsl:template>
</xsl:stylesheet>

Andernfalls implementieren Sie das XML-Schema direkt in XSLT. Im folgenden Beispiel habe ich auf eine separate Variable verzichtet und die XML-Schema-Validierung auf den XSL-Transformations-Output bezogen.


<xsl:stylesheet 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     exclude-result-prefixes="xs"
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     version="3.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:import-schema 
       use-when="system-property('xsl:is-schema-aware') eq 'yes'">
    <xs:schema elementFormDefault="qualified">
      <xs:element name="root">
        <xs:complexType>
          <xs:sequence>
            <xs:element 
                ref="m" 
                minOccurs="0" 
                maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="m" type="CTattribute"/>
      <xs:complexType name="CTattribute">
        <xs:attribute name="vn" type="stringmax20"/>
        <xs:attribute name="nn" type="stringmax20"/>
        <xs:attribute name="wo" type="stringmax20"/>
      </xs:complexType>
      <xs:simpleType name="stringmax20">
        <xs:restriction base="xs:string">
          <xs:minLength value="2"/>
          <xs:maxLength value="20"/>
          <xs:pattern value="[A-Z][a-z]*"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:schema>
  </xsl:import-schema>
  <xsl:template match="/">
    <root xsl:validation="strict">
      <xsl:for-each select="//Mensch">
        <m vn="{vorname}" 
           nn="{name}" 
           wo="{../name}"/>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>

wg / 5. April 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XSL_import_schema.html