¿Cómo definir los elementos en una DTD que comparten la declaración?
-
06-07-2019 - |
Pregunta
¿Cómo puedo definir los elementos en una DTD que comparten la misma declaración?
Intenté esto, lo que lleva a un error de sintaxis:
<!ELEMENT (expression|condition) (code-text+)>
Cuando expresión y condición tienen la misma declaración, eso significa los mismos subelementos y atributos.
Solución
(Nota al margen: En principio, estoy de acuerdo con usar XSD en lugar de DTD (alternativamente, use RelaxNG , que es una buena alternativa estandarizada a XSD y mucho más breve, más fácil de entender y leer. No se preocupe demasiado por el código extendido. Es muy fácil de leer y le brinda un gran poder expresivo. En lugar de ser bloqueado por la tecnología, lo ayudará a construir lo que necesita. Los IDE como Visual Studio, Eclipse y otros tienen herramientas de diseño gráfico para construir su modelo, lo que facilita la creación de XSD.)
Pero eso no responde a tu pregunta. Es bastante fácil reutilizar una definición en un DTD. Mire los HTML DTD s, sucede todo el tiempo. La clave es utilizar entidades de parámetros. Aquí hay un ejemplo 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;>
que básicamente hace que los elementos hello
y world
contengan exactamente el mismo conjunto de atributos y contenido. Utilicé una definición de elementos no obligatorios y no ordenados como contenido, lo que hace que el siguiente documento XML sea válido con la DTD anterior:
<?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>