c# - validar - Permitir que el elemento de fecha XSD esté vacío
validate schema xsd c# (2)
Me gustaría permitir que un elemento sea xs:date
o una cadena vacía.
Aquí hay un esquema XML que he probado:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:lp="urn:oio:ebst:diadem:lokalplan:1"
targetNamespace="urn:oio:ebst:diadem:lokalplan:1"
elementFormDefault="qualified" xml:lang="DA"
xmlns:m="urn:oio:ebst:diadem:metadata:1">
<xs:import schemaLocation="../key.xsd" namespace="urn:oio:ebst:diadem:metadata:1" />
<xs:element name="DatoVedtaget" type="lp:DatoVedtagetType" />
<xs:complexType name="DatoVedtagetType">
<xs:simpleContent>
<xs:extension base="xs:date">
<xs:attribute ref="m:key" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="DatoVedtagetTypeString">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="m:key" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
Quiero que el elemento sea DatoVedtagetType
en caso de que incluya un valor, y quiero que sea DatoVedtagetTypeString
si está vacío. ¿Cómo implemento tal funcionalidad condicional este esquema?
Según los comentarios sobre la pregunta, el objetivo es que DatoVedtaget
sea xs:date
o empty. Aquí hay una manera de expresar tal restricción:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:lp="urn:oio:ebst:diadem:lokalplan:1"
xmlns:m="urn:oio:ebst:diadem:metadata:1"
targetNamespace="urn:oio:ebst:diadem:lokalplan:1"
elementFormDefault="qualified"
xml:lang="DA">
<xs:import schemaLocation="../key.xsd" namespace="urn:oio:ebst:diadem:metadata:1" />
<xs:element name="DatoVedtaget" type="lp:DatoVedtagetType" />
<xs:simpleType name="empty">
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="dateOrEmpty">
<xs:union memberTypes="xs:date lp:empty"/>
</xs:simpleType>
<xs:complexType name="DatoVedtagetType">
<xs:simpleContent>
<xs:extension base="lp:dateOrEmpty">
<xs:attribute ref="m:key" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
En lugar de usar un tipo de unión como lo hace @kjhughes, mi propia solución preferida es usar un tipo de lista que permita cero o una ocurrencia:
<xs:simpleType name="dateOrEmpty">
<xs:list itemType="xs:date" maxLength="1"/>
</xs:simpleType>
Una razón para la preferencia es que es menos código. Otra razón es que si escribe código XSLT o XQuery con reconocimiento de esquema, el valor resultante es más fácil de manipular (el valor atomizado tiene tipo xs: date? Que es más fácil de manipular, por ejemplo, para probar vacío, que un tipo de unión )