2017-03-29 1 views
0

Ich habe 3 Arten von XML-Blöcken, die keinen "Filter" -Block enthalten, oder "Filter" mit "Ungültigkeitserklärung", deren erster Wert entweder "fixed1" oder "fixed2" ist; wenn "fixed1": nichts anderes, wenn "fixed2", diese Sequenz A1, A2, A3 (siehe unten):XSD: Wie validiere ich dieses XML, wobei die Folgen vom Wert des ersten abhängen?

 <filter> 
      <invalidation>fixed1</invalidation> 
     </filter> 

     <filter> 
      <invalidation>fixed2</invalidation> 
      <A1>string...</A1> 
      <A2>string...</A2> 
      <A2>string...</A3> 
     </filter> 

Wie dies bestätigen? Ich habe das Gefühl, dass es eine Lösung mit xs: choice gibt, aber ich konnte sie nicht finden.

Die einzige (schlecht) Lösung, die ich gefunden ist:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
... 
<xs:simpleType name="invalidation"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="fixed1|fixed2"/> 
    </xs:restriction> 
</xs:simpleType> 
... 
<xs:element name="filter" minOccurs="0"> 
    <xs:complexType> 
    <xs:all> 
     <xs:element name="invalidation" type="invalidation"/> 
     <xs:element name="A1" type="xs:string" minOccurs="0"/> 
     <xs:element name="A2" type="xs:string" minOccurs="0"/> 
     <xs:element name="A3" type="xs:string" minOccurs="0"/> 
    </xs:all> 
    </xs:complexType> 
</xs:element> 
+0

versuchen Sie es mit einem ' 'siehe: http://stackoverflow.com/questions/24774554/xsd-1-1-xsalternative-xssert –

+1

@ Jérôme, xs: Alternative funktioniert nur, wenn die Auswahl von Ein Typ basiert auf Attributwerten und kann nicht auf dem Wert des ersten Elements basieren. –

Antwort

1

Dies kann nicht in XSD 1.0 erfolgen.

Es kann in XSD 1.1 mit Assertions getan werden. Definieren Sie die Struktur als Sequenz mit dem Content-Modell (invalidation, (A1, A2, A3)?) und definieren Sie dann eine Assertion: not(invalidation='fixed1' and exists(A1)).

XSD 1.1 wird in Altova, Saxon und Apache Xerces unterstützt, aber nicht in anderen Produkten wie den integrierten Validatoren in Java und .NET.

+0

Leider scheint mein Validator "xmllint" XSD 1.0 zu verwenden. –

Verwandte Themen