Définir un élément XSD qui peut être un dateTime ou vide avec un attribut
Ma question est presque exactement la même que cette une, mais pour un xs:dateTime type plutôt que d'un élément défini par l'utilisateur.
Un élément dans mon XML (dont je ne fais pas) peut ressembler à:
<parent>
...
<start>2012-01-01T00:00:00.000</start>
<end>2013-01-01T00:00:00.000</end>
...
</parent>
-ou-
<parent>
...
<start reference="a string" />
<end reference="a string" />
...
</parent>
En d'autres termes, à l'intérieur de l'élément parent, le "début" et "fin" champs peuvent contenir soit une valeur xs:dateTime, ou sera vide mais qui ont une "référence" de l'attribut (que ce soit dans le domaine de l'un ou de l'autre parent, ils ne sont pas nécessairement à la fois une référence ou une dateTime). J'ai essayé toutes sortes de façons de représenter dans un XSD, mais n'ont pas trouvé une solution. Le plus proche que je suis venu est " (extrait d'un beaucoup plus grand XSD):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="DateOrRef">
<xs:simpleContent>
<!-- <xs:extension base="xs:dateTime"> This does not validate-->
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="reference" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="parent">
<xs:sequence>
<xs:element minOccurs="0" name="start" type="DateOrRef" />
<xs:element minOccurs="0" name="end" type="DateOrRef" />
</xs:sequence>
</xs:complexType>
</xs:schema>
qui ne valider le, mais n'empêche pas le nœud de contenu a une valeur xs:dateTime. Si je change l'extension du type de base à un xs:dateTime au lieu de xs:string comme dans le commentaire sur la ligne, les éléments vides ne plus valider parce que le type dateTime n'est pas autorisé à être vide.
Comment ai-je pu la structure XSD pour valider ces champs xs:dateTime au lieu de xs:string?
OriginalL'auteur Sean Purcell | 2013-09-13
Vous devez vous connecter pour publier un commentaire.
1 Vous pouvez déclarer l'élément nillable (comme suggéré par Ben).
2 Vous pouvez déclarer un type simple qui est une union de xs:dateTime et la chaîne vide. C'est plus facile à suivre si nous construisons dans les stades. Tout d'abord, déclarer un nom de type simple dont la seule valeur est une chaîne vide:
Puis de déclarer un type d'union dont les membres sont xs:dateTime et vide-chaîne:
Ensuite utiliser dateTime-ou-rien que la base de votre extension de l'étape:
Si l'attribut de référence devrait se produire si et seulement si l'élément n'a pas de contenu, puis vous aurez besoin d'un XSD 1.1 l'affirmation à l'effet (ou un accessoire Schematron schéma, ou ad-hoc code de validation au niveau de la couche application). XSD modèles de contenu le rendre facile à dire, vous devez avoir un dateTime ou une référence, mais seulement si chacune de ces options est représenté par un élément enfant.
OriginalL'auteur C. M. Sperberg-McQueen
Je ne pense pas qu'il est possible de valider ces éléments en tant que xs:dateTime si elles sont vides. Si vous aviez le contrôle de l'entrée XML, je suggère que vous pourriez marquer les éléments comme "néant", et de définir l'élément à nillable dans le schéma.
Cela signifie que ce fragment:
...validera à l'encontre de ce schéma:
Sans être en mesure de modifier le XML d'entrée, le meilleur que j'ai pu arriver, c'est l'aide de l'une ou de plusieurs
xs:assertion
éléments à valider le fait que la chaîne de caractères correspond au format dateTime, c'est à dire à l'aide de XPath "correspond à la fonction".Vous pouvez également déclarer un
xs:simpleType
avec unxs:restriction
etxs:pattern
que les doublons de la validation d'une xs:dateTime.OriginalL'auteur Ben