Comment définir des éléments dans une DTD qui partagent la déclaration?
-
06-07-2019 - |
Question
Comment définir des éléments dans une DTD qui partagent la même déclaration?
J'ai essayé ce qui a entraîné une erreur de syntaxe:
<!ELEMENT (expression|condition) (code-text+)>
Où expression et condition ont la même déclaration, cela signifie les mêmes sous-éléments et attributs.
La solution
(Remarque: en principe, je suis d'accord pour utiliser XSD au lieu de DTD (sinon utilisez RelaxNG , qui est une bonne alternative standardisée à XSD, beaucoup plus brève et beaucoup plus facile à comprendre et à lire.) Ne vous inquiétez pas trop du code étendu, il est assez facile à lire et vous donne un puissant pouvoir d’expression. Au lieu d'être bloqués par la technologie, ils vous aideront à créer ce dont vous avez besoin. Les IDE tels que Visual Studio, Eclipse et autres disposent d'outils de conception graphique pour la construction de votre modèle, ce qui facilite grandement la création de XSD.)
Mais cela ne répond pas à votre question. Il est assez facile de réutiliser une définition dans une DTD. Regardez la DTD HTML , tout se passe bien. le temps. La clé consiste à utiliser des entités paramètres. 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 que les éléments hello
et world
contiennent exactement le même ensemble d’attributs et de contenu. J'ai utilisé une définition d'éléments non obligatoires et non ordonnés en tant que contenu, 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>