Schéma XML pour limiter un champ basé sur une autre
Question
Je le schéma suivant, que j'utilise pour faire en sorte que la PhoneNumber
et PhoneNumberType
d'une personne (maison, travail, etc.) ne sont pas plus de 10 caractères. Cependant, je veux améliorer ce schéma afin que PhoneNumberType
ne soit pas nécessaire si une PhoneNumber
n'est pas fourni, mais il est nécessaire si le PhoneNumber
est fourni. Est-il possible de le faire dans le schéma XML 1.0?
Je sais cela pourrait se faire dans le schéma XML 1.1 en utilisant <xs:assert/>
, mais malheureusement je suis coincé avec un schéma XML 1.0.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xs:element name="PhoneNumber">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="PhoneNumberType">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xsd:schema>
La solution
Désolé, le schéma XML ne peut pas le faire.
Quelques questions similaires:
- peut la longueur de deux listes xml définis comme étant nécessaire pour être égal?
- restreindre les valeurs d'élément fonction de l'attribut
- Comment utiliser attribuer une valeur en tant que discriminateur pour la sélection de type XML polymorphes
- Comment valider en XSD la valeur de nœud xml contre sa valeur de nœud xml voisin
Autres conseils
Il me semble que ce soit une relation « a ».
Si vous avez un élément PhoneNumber, il devrait avoir une propriété qui est de type PhoneNumberType. Plutôt que de déconner avec la validation et les restrictions, je suggère que vous tournez PhoneNumber dans un élément complexe et de faire PhoneNumberType une propriété nécessaire de celui-ci.
Peut être trop tard, mais vous pouvez les mettre dans le groupe comme celui-ci
<xs:group name="group">
<xs:sequence>
<xs:element ref="PhoneNumber"/>
<xs:element ref="PhoneNymberType" />
</xs:sequence>
Et faire ce groupe nécessaire ou non