XML Schema per limitare un campo basato su un altro
Domanda
Ho il seguente schema, che io uso per garantire che PhoneNumber
di una persona e PhoneNumberType
(casa, lavoro, etc.) non è più lungo di 10 caratteri. Tuttavia, voglio migliorare questo schema in modo che PhoneNumberType
non è necessaria se non è previsto un PhoneNumber
, ma è necessaria se viene fornito il PhoneNumber
. C'è un modo per fare questo in XML Schema 1.0?
Sono consapevole che questo potrebbe essere realizzato in XML Schema 1.1 utilizzando <xs:assert/>
, ma purtroppo io sono bloccato con XML Schema 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>
Soluzione
Siamo spiacenti, XML Schema non può farlo.
Alcune domande simili:
- può la lunghezza delle due liste XML definiti come richiesto per essere uguali?
- Limitare Element valori basati su attributi
- Come utilizzare attribuire valore come discriminante per la selezione del tipo polimorfico XML?
- Come convalidare in XSD il valore del nodo XML contro il suo valore nodo vicino xml
Altri suggerimenti
Mi sembra che questa sia una relazione "ha".
Se si dispone di un elemento di PhoneNumber, allora dovrebbe avere una proprietà che è di tipo PhoneNumberType. Invece di fare in giro con la convalida e restrizioni, vorrei suggerire che si accende PhoneNumber in un elemento complesso e fare PhoneNumberType una proprietà obbligatoria di esso.
potrebbe essere troppo tardi, ma li si può mettere in gruppo come questo
<xs:group name="group">
<xs:sequence>
<xs:element ref="PhoneNumber"/>
<xs:element ref="PhoneNymberType" />
</xs:sequence>
E rendere questo gruppo richiesto o no