Esquema XML para restringir un campo basándose en otro
Pregunta
Tengo el siguiente esquema, que utilizo para asegurar que PhoneNumber
y PhoneNumberType
de una persona (casa, trabajo, etc.) no más de 10 caracteres se ofrecen. Sin embargo, quiero mejorar este esquema por lo que no se requiere que PhoneNumberType
si no se proporciona un PhoneNumber
, pero es necesario si se proporciona la PhoneNumber
. ¿Hay una manera de hacer esto en el esquema XML 1.0?
Soy consciente de que esto podría llevarse a cabo en el esquema XML 1.1 usando <xs:assert/>
, pero por desgracia estoy atascado con el esquema 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>
Solución
En este momento, el esquema XML no puede hacer eso.
Algunas preguntas similares:
- Can la longitud de dos listas de XML puede definir como que se requiera para que sea igual?
- restringir los valores de elemento basado en el atributo
- Cómo uso valor del atributo como un discriminador para la selección XML tipo polimórfico?
- Cómo validar en XSD el valor del nodo XML en contra del valor del nodo vecino xml
Otros consejos
Me parece que este es un "tiene" relación.
Si usted tiene un elemento de Fax, entonces debería tener una propiedad que es de tipo PhoneNumberType. En lugar de jugar un poco con la validación y restricciones, sugeriría que active Fax en un elemento complejo y hacer PhoneNumberType una propiedad necesaria de la misma.
Puede ser demasiado tarde, pero se puede ponerlos en grupo como éste
<xs:group name="group">
<xs:sequence>
<xs:element ref="PhoneNumber"/>
<xs:element ref="PhoneNymberType" />
</xs:sequence>
Y hacer que este grupo requiere o no