2017-08-10 1 views
1

Lors de la définition d'un élément dans la DTD, il est une caractéristique d'exclure des éléments de son modèle de contenu, par exemple:Comment faire pour exclure du contenu dans XSD?

<!ELEMENT i - - (%inline;) -(i)> 

Au lieu de répéter le modèle de contenu pour chaque élément séparément, nous listons simplement des éléments similaires comme modèle groupe (entité dans DTD) et exclure ce dont nous n'avons pas besoin dans certains éléments. Dans le schéma XML, je peux utiliser des types complexes avec héritage et/ou groupes de modèles pour partager le même modèle de contenu entre les éléments, mais pour exclure certains éléments, je dois répéter tout le modèle de contenu sans ajouter d'éléments indésirables. Trop de code à taper, à lire, à éditer ...

Existe-t-il un autre moyen, simple et beau, d'implémenter cela dans XML Schema, ou je devrais utiliser RelaxNG ou chercher des outils pour générer des schémas? En bref, dans la terminologie XML Schema, je veux (et j'ai vraiment besoin) quelque chose comme la dérivation par restriction, mais pas la duplication du modèle de contenu.

Répondre

1

Un assert tel que

not(./*/local-name-from-QName(node-name(.)) = 'put-name-to-exclude-here') 

peut faire l'affaire, mais nécessite un schéma XML 1.1.

Par exemple, en utilisant un groupe (c.-à-cela est techniquement pas exactement la dérivation par restriction):

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 
    <xs:group name="base"> 
     <xs:sequence> 
      <xs:element name="a" type="xs:string" minOccurs="0"/> 
      <xs:element name="b" type="xs:string" minOccurs="0"/> 
      <xs:element name="c" type="xs:string" minOccurs="0"/> 
     </xs:sequence> 
    </xs:group> 
    <xs:complexType name="excluding-a"> 
     <xs:sequence> 
      <xs:group ref="base"/> 
     </xs:sequence> 
     <xs:assert test="not(./*/local-name-from-QName(node-name(.)) = 'a')"/> 
    </xs:complexType> 
    <xs:element name="root" type="excluding-a"/> 
</xs:schema> 

Ce sera valable:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <b/> 
    <c/> 
</root> 

Et ce sera invalide:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <a/> 
    <b/> 
    <c/> 
</root> 

Une autre approche qui utilise explicitement la dérivation implique la dérivation par extension, comme Aussi intuitif que cela puisse paraître (une restriction nécessiterait de répéter tous les éléments). C'est parce que la sémantique de XML Schema concernant la dérivation n'est pas stricte en termes d'inclusion de l'espace de valeur:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 
    <xs:complexType name="base"> 
     <xs:sequence> 
      <xs:element name="a" type="xs:string" minOccurs="0"/> 
      <xs:element name="b" type="xs:string" minOccurs="0"/> 
      <xs:element name="c" type="xs:string" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="derived"> 
     <xs:complexContent> 
      <xs:extension base="base"> 
       <xs:assert test="not(*/local-name-from-QName(node-name(.)) = 'a')"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:element name="root" type="derived"/> 
</xs:schema> 
+0

Oh, c'est joli! Je vais le tester ce soir. La version 1.1 et les groupes pour l'utilisation à l'intérieur des classes est exactement ce que je veux. –