Gern stehe ich zur fachlichen Unterstützung in XML-Technologien, C#.NET, VisualBasic.NET und Java zur Verfügung. Sprechen Sie mich einfach an: Mail oder ☎ 0151 . 750 360 61


XML-Validierung: Wozu? / xs:nillable, xsi:nil

xs:nillable, xsi:nil

xs:nillable, xsi:nil

xs:nillable bzw. xsi:nil ermöglicht, dass ein XML-Dokument auch dann valide sein kann, wenn streng typisierte Datenfelder leer sind, die normalerweise wenigstens einen Default-Wert erzwingen.

Auf dieser Seite:

Das folgende XML-Schema definiert mehrere Elemente mit Datentypen, die im XML-Dokument zumindest Default-Werte erzwingen.


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Zeit"/>
                <xs:element ref="Normalzahl"/>
                <xs:element ref="Dezimalzahl"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Zeit"        type="xs:dateTime" nillable="true"/>
    <xs:element name="Normalzahl"  type="xs:integer"  nillable="true"/>
    <xs:element name="Dezimalzahl" type="xs:decimal"  nillable="true"/>    
</xs:schema>

Valide wäre ein XML-Dokument dieser Struktur:


<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="nillable.xsd">
    <Zeit>2018-09-01T18:13:51.0</Zeit>
    <Normalzahl>0</Normalzahl>
    <Dezimalzahl>0</Dezimalzahl>
</root>

Sind die Felder jedoch leer, so ist das XML-Dokument nicht valide.


<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="nillable.xsd">
    <Zeit></Zeit>
    <Normalzahl></Normalzahl>
    <Dezimalzahl></Dezimalzahl>
</root>

Das Dokument ist dennoch valide, wenn bei den leeren Datenfeldern xsi:nil="true" und im XSD nillable="true" deklariert ist.


<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="nillable.xsd">
    <Zeit xsi:nil="true"></Zeit>
    <Normalzahl xsi:nil="true"></Normalzahl>
    <Dezimalzahl xsi:nil="true"></Dezimalzahl>
</root>

XSD -> XSLT -> XML: Generieren von Beispieldateien mit xsi:nil="true"

Etwas aufwendiger wird die Angelegenheit, wenn aus dem XML-Schema XML-Beispieldateien generiert werden sollen, die "xsi:nil" enthalten. Hier können Sie mit arbeiten.


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    version="2.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:attribute-set name="as_nillable">
    <xsl:attribute name="xsi:nil" select="'true'"/>
  </xsl:attribute-set>
  <xsl:template match="/xs:schema">
    <xsl:apply-templates select="/xs:schema/xs:element[@name='root']"/>
  </xsl:template>
  <xsl:template match="xs:element">
    <xsl:choose>
      <xsl:when test="@name='root'">
        <xsl:element name="{@name}"> 
          <xsl:attribute name="xsi:noNamespaceSchemaLocation">
                nillable.xsd
          </xsl:attribute>
          <xsl:for-each select="xs:complexType/xs:sequence/xs:element">
            <xsl:variable name="vref" select="@ref"/>
            <xsl:apply-templates 
               select="/xs:schema/xs:element[@name = $vref]" />            
          </xsl:for-each>
        </xsl:element>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="{@name}" use-attribute-sets="as_nillable"/> 
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

wg / 15. September 2018



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/nillable.html