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.

¿Fue útil?

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top