2009-10-25 20 views
1

Comment puis-je définir des éléments dans une DTD qui partagent la même déclaration?Comment définir des éléments dans une DTD qui partagent la déclaration?

J'ai essayé ce qui conduit à une erreur de syntaxe:

<!ELEMENT (expression|condition) (code-text+)> 

où l'expression et de l'état ont la même déclaration, cela signifie que les mêmes sous-éléments et attributs.

+0

Vous ne pouvez pas le faire avec DTDs, ils ne sont pas assez expressif. C'est pourquoi la DTD est obsolète et la plupart utilisent XML Schema à la place. – skaffman

+0

Je pensais à l'utilisation de XSD mais ils sont très horribles à écrire. J'obtiendrais un très gros fichier que j'espérais obtenir :-( – codymanix

+0

Pourrais-je en quelque sorte utiliser une entité pour "copier" la déclaration? – codymanix

Répondre

2

(Note subsidiaire: En principe, je serais d'accord avec l'utilisation de XSD au lieu de DTD (sinon, utilisez RelaxNG, qui est une bonne alternative standard à XSD et beaucoup plus courte et beaucoup plus facile à comprendre et à lire). il est très facile à lire et vous donne un fort pouvoir expressif: au lieu d'être bloqué par la technologie, il vous aidera à construire ce dont vous avez besoin .Des IDE comme Visual Studio, Eclipse et d'autres ont un design graphique outils pour construire votre modèle qui rend la création de XSD un jeu d'enfant.)

Mais cela ne répond pas à votre question. Il est assez facile de réutiliser une définition dans une DTD. Regardez le HTML DTD s, ça arrive tout le temps. La clé consiste à utiliser des entités de paramètre. Voici un exemple simple:

<!-- the "model" --> 
<!ENTITY % commoncontent 
    "content | xxx"> 
<!ENTITY % commonattrs 
    "att1 CDATA #IMPLIED 
    att2 CDATA #IMPLIED"> 

<!-- elements --> 
<!ELEMENT root ANY> 
<!ELEMENT content ANY> 
<!ELEMENT xxx EMPTY> 

<!-- elements that share the same model --> 
<!ELEMENT hello (%commoncontent;)+> 
<!ELEMENT world (%commoncontent;)+> 

<!-- adding the attributes to the elements with the same model --> 
<!ATTLIST hello %commonattrs;> 
<!ATTLIST world %commonattrs;> 

qui fait essentiellement hello et world éléments contiennent exactement le même ensemble d'attributs et de contenu. J'ai utilisé une définition des éléments non obligatoires et que le contenu désordonnées, ce qui rend le document XML suivant valide avec la DTD ci-dessus:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root SYSTEM "multipleSharedDefinitions.dtd"> 
<root> 
    <hello att1="bla">    
     <content /> 
    </hello> 
    <world att1="bla" att2="blabla"> 
     <content /> 
     <xxx /> 
    </world> 
</root>