Einschränkung von Elementen basierend auf einem anderen Attribut mit XSD 1.1
Ich versuche zum erstellen einer schema-definition mittels XSD 1.1, in denen die Anzahl der Elemente ist abhängig von dem Attribut eines anderen Elementes.
E. g. Die Anzahl der BaPath Elemente BaPath hängt vom Wert des Attributs "service" von "Conn" - element.
Die xsd ich geschrieben habe, ist
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Mapping">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Link" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Env">
<xsd:complexType>
<xsd:attribute name="name" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="UTEST" />
<xsd:enumeration value="TEST" />
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="Link">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Conn" maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="service" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="FILESNF" />
<xsd:enumeration value="MSGSNF" />
<xsd:enumeration value="MSGRT" />
<xsd:enumeration value="FILERT" />
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="Conn">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="BaPath" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="BaPath">
<xsd:complexType>
<xsd:attribute name="flow" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:assertion test="@service eq 'MSGRT'">
<xsd:enumeration value="TRS" />
<xsd:enumeration value="ZTRS" />
</xsd:assertion>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="Dep">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Env" maxOccurs="unbounded" />
<xsd:element ref="Mapping" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="CfgType">
<xsd:sequence>
<xsd:element ref="Dep" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="Cfg" type="CfgType"></xsd:element>
</xsd:schema>
</Cfg>
zum Beispiel, wenn Conn-element hat ein Attribut service eq 'MSGRT' es muss 2 BaPath Elemente mit Attributen Klinken-und ZTRS
<Cfg xmlns="http://www.alpha.com/beta">
<Dep>
<Env name="UTEST"/>
<Mapping>
<Link t2s_service="MSGRT">
<Conn>
<BaPath flow="ZTRS"/>
<BaPath flow="TRS"/>
</Conn>
</Link>
</Mapping>
</Dep>
wenn service eq 'FILESNF' von Conn es müssen 3 BaPath Elemente mit Attributen FTS, ZFTS und MSSDN
Ich versuchte verschiedene Lösungen, aber keine scheint zu funktionieren. Ist es möglich, dieses problem zu lösen, die mit der Geltendmachung von xsd 1.1?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man verwenden behauptet in der Link element (und eine Aufzählung aller Werte in der flow - Attribut).
Erklärung für eines der assert (der andere behauptet wäre ähnlich):
(@service ne 'MSGRT') or (count(Conn[count(BaPath[@flow eq 'TRS']) eq 1 and count(BaPath[@flow eq 'ZTRS']) eq 1 and count(BaPath) eq 2]) eq count(Conn))
Zuerst überprüfen wir die service Attribut.
Dann, mit
Conn[count(BaPath[@flow eq 'TRS']) eq 1 and count(BaPath[@flow eq 'ZTRS']) eq 1 and count(BaPath) eq 2]
wir wählen alle die Conn element der Link, die haben genau zwei BaPath Kinder (eins mit flow=TRS und andere mit flow=ZTRS).Danach überprüfen wir, dass alle von der Conn-Elemente passieren, dass die Einschränkung.
So, mit diesem, diesem Beispiel gilt:
In diesem Beispiel wird nicht gültig sein:
In diesem Beispiel wird nicht gültig sein:
In diesem Beispiel wird nicht gültig sein:
Edit:
Andere Möglichkeit es zu nutzen
conditional type alternatives
(Beispiel hier), aber Sie würden wahrscheinlich benötigen, um doppelte Teile von Ihr Schema.