DTD ou XSD pour l'attribut XML où la liste d'énumération inclut null

Mon objectif / question est de comprendre comment créer une DTD ou un schéma pour XML où une énumération de valeurs pour un attribut peut inclure null comme valeur valide.

La spécification W3C pour XML définit des contraintes de validité d'attribut, dont l'une est une énumération. Il s'agit d'une liste codée en dur de valeurs valides pour les attributs. Exemple :

<foo att="aaa" />

La valeur "aaa" doit être dans la liste des attributs valides pour l'élément foo ou l'attribut peut être marqué par DTD ou XSD.

Cette liste peut être définie en DTD dans le !ATTELEZ comme suit:

att ( aaa | bbb ) #IMPLIED

Dans XSD, cela ressemble à ceci:

<xs:attribute name="att">
  <xs:simpleType>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="aaa" />
      <xs:enumeration value="bbb" />
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

Maintenant, que se passe-t-il si une valeur vide est acceptable? Je ne parle pas d'un attribut #IMPLIED=optional. Je parle d'un attribut où une valeur vide est tout aussi valide que "aaa" ou "bbb". Les DTD et XSD suivants sont non valides :

<!ATTLIST att ( | aaa | bbb ) #IMPLIED>

<xs:attribute default="" name="att">
  <xs:simpleType>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="" />
      <xs:enumeration value="aaa" />
      <xs:enumeration value="bbb" />
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

Dans ces exemples, l'attribut att est facultatif (#IMPLICITE) mais s'il est présent, il devrait autorisez également une valeur vide : att="". Le XSD va encore plus loin en indiquant que si la valeur n'est pas présente, sa valeur sera affectée à null.

La validation de tels attributs doit être conforme à ce modèle (de la section 3.3.1, exemple [59]) :

Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')'

Cette expression régulière définit la séquence DTD ci-dessus "(aaa/bbb)". Après zéro ou un espace " S?"nous pouvons avoir un Nmtoken, éventuellement suivi d'un autre espace et d'un tuyau pour plus de Nmtokens. Le Nmtoken est défini dans la section 2.3 comme commençant par un tableau de noms. Il n'y a pas d'allocation pour null. Le NameStartChar ne peut pas être une citation ou une chaîne vide.

Mais dans le code commun, nous pouvons définir un élément d'une énumération comme une chaîne vide, et nous pouvons définir des types nullables, y compris des énumérations. Plus précisément, il y a du code où nous passons une chaîne à une méthode qui est ensuite validée par une énumération.

Le problème / l'application que j'essaie de résoudre concerne la façon de définir une syntaxe XML valide dans DTD et/ou XSD où le code traitant le XML peut accepter une chaîne vide. Sans cela, le XML ne valide pas att="" même s'il est valide. Ça nous intéresse ? Eh bien, pour le code avec lequel je travaille maintenant, je le fais.

N'entrons pas dans la validité des chaînes vides dans une énumération, en utilisant enum.Aucun, en utilisant la méthode (Enum val) plutôt que la méthode (String val), etc. Le fait est que ce code est dans la nature. Il existe dans des logiciels libres communs, il fonctionne, et nous n'allons pas le réécrire. Le problème crée XML définit fidèlement le code.

Il existe une syntaxe XSD pour définir des valeurs alternatives pour un attribut. J'accepterais un modèle pour cela qui fonctionne pour ce scénario. Dans mon projet immédiat, je génère DTD (Ant task AntStructure) et je le convertit en XSD. La DTD n'est pas valide, donc le XSD l'est aussi. J'aimerais le faire avec la DTD mais ce n'est pas critique.

demandé sur