validate validar probar error con check c# xml xsd schema

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 )