Aktuelle Remote-Seminare mit Durchführungsgarantie: Etwas Werbung in eigener Sache Termine: 03.08.-05.08.2020, 21.09.-23.09.2020, 23.11.-25.11.2020, 07.12.-09.12.2020, 22.03.-24.03.2021, 07.06.-09.06.2021, 06.09.-08.09.2021XML Einführung und Grundlagen Termine: 06.08.2020, 20.10.2020, 13.11.2020, 10.12.2020, 25.03.2021, 10.06.2021, 09.09.2021XML - der professionelle Überblick Termine: 23.11.-26.11.2020, 29.03.-01.04.2021Einstieg in die Programmierung Termine: 17.08.-19.08.2020, 14.12.-16.12.2020, 07.04.-09.04.2021XML, XSLT, XPath, XSL-FO Einführung Termine: Termin nach WunschEinstieg in C#.NET Termine: 21.09.-23.09.2020, 11.01.-13.01.2021, 26.05.-28.05.2021, 27.09.-29.09.2021VB.NET für Visual Basic-Programmierer Termine: 21.10.-23.10.2020, 14.12.-16.12.2020, 08.03.-10.03.2021, 19.07.-21.07.2021, 23.08.-25.08.2021XML Grundlagen, XSL-FO, SVG, DocBook, DITA Termine: Termin nach WunschJava Grundlagen Termine: 03.08.-06.08.2020, 30.11.-03.12.2020, 29.03.-01.04.2021C++ für Programmiereinsteiger Termine: 10.09.2020, 11.12.2020, 16.03.2021Neues Seminar: XProc Grundlagen Termine: 21.09.-25.09.2020, 01.03.-05.03.2021Java/JSP/HTML/JDBC/XML Komplett Termine: 07.09.-09.09.2020, 21.10.-23.10.2020, 23.11.-25.11.2020, 25.01.-27.01.2021, 12.04.-14.04.2021, 26.07.-28.07.2021Python für Programmiereinsteiger Last-Minute-Seminare, noch freie Plätze XML Einführung und Grundlagen03.08.-05.08.2020 XML, XSLT, XPath, XSL-FO Einführung17.08.-19.08.2020 Python für Programmiereinsteiger07.09.-09.09.2020

XPROC * XSL-FO * SVG * XML * XML-SCHEMA * XPATH * XSL * XSLT 1.0 * XSLT 2.0 * XSLT 3.0 * XQUERY * ANT



XSL / xsl:import-schema

xsl:import-schema

xsl:import-schema

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

Auf dieser Seite:

Die Notwendigkeit zu sorgfältiger 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>

Schema-Validierung mehrerer XML-Dateien mit Exceptionhandling

Bewährt hat sich die Kombination von xsl:import-schema mit der -Funktion und :


<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:err="http://www.w3.org/2005/xqt-errors" 
  exclude-result-prefixes="xs err"
  version="3.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:import-schema 
    schema-location="Ort_Elemente_hierarchisch.xsd" 
    use-when="system-property('xsl:is-schema-aware') eq 'yes'"/>
  <xsl:template match="/">
    <ergebnis>      
      <xsl:for-each 
           select="collection('(VERZEICHNISPFAD)/?select=Ort*.xml;recurse=no')">
        <xsl:variable name="vfilename" select="base-uri()" />                
        <datei filename="{$vfilename}">
          <xsl:try>
            <xsl:document validation="strict">
              <xsl:copy-of select="."/>
            </xsl:document>
            <xsl:catch errors="*">              
              <xsl:message>
                <xsl:value-of 
                  select="concat('Code     : ', $err:code)"/>
              </xsl:message>
              <xsl:message>
                <xsl:value-of 
                  select="concat('Description : ', $err:description)"/>
              </xsl:message>
              <xsl:message>
                <xsl:value-of 
                  select="concat('Value    : ', $err:value)"/>
              </xsl:message>
              <xsl:message>
                <xsl:value-of 
                  select="concat('Module    : ', $err:module)"/>
              </xsl:message>
              <xsl:message>
                <xsl:value-of 
                  select="concat('line-number : ', $err:line-number)"/>
              </xsl:message>
              <xsl:message>
                <xsl:value-of 
                  select="concat('column-number: ', $err:column-number)"/>
              </xsl:message>    
            </xsl:catch>
          </xsl:try>
        </datei>
      </xsl:for-each>
    </ergebnis>
  </xsl:template>
</xsl:stylesheet>

wg / 11. Juli 2019



Fragen? Anmerkungen? Tipps?

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