Domanda

Come posso definire elementi in un DTD che condividono la stessa dichiarazione?

Ho provato questo che porta ad un errore di sintassi:

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

Dove espressione e condizione hanno la stessa dichiarazione, ciò significa gli stessi sotto-elementi e attributi.

È stato utile?

Soluzione

(Nota a margine: in linea di principio concordo con l'uso di XSD invece di DTD (in alternativa, utilizzare RelaxNG , che è una buona alternativa standardizzata a XSD e molto più breve e molto più facile da capire e leggere). Non preoccuparti troppo del codice esteso. È abbastanza facile da leggere e ti dà un forte potere espressivo. Invece di essere bloccato dalla tecnologia, ti aiuterà a costruire ciò di cui hai bisogno. Gli IDE come Visual Studio, Eclipse e altri hanno strumenti di progettazione grafica per costruire il tuo modello che rende la creazione di XSD un gioco da ragazzi.)

Ma questo non risponde alla tua domanda. È abbastanza facile riutilizzare una definizione in un DTD. Guarda le DTD HTML , succede tutto il tempo. La chiave è usare le entità parametro. Ecco un semplice esempio:

<!-- 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;>

che fondamentalmente rende gli elementi hello e world contengono esattamente lo stesso insieme di attributi e contenuti. Ho usato una definizione di elementi non obbligatori e non ordinati come contenuto, che rende valido il seguente documento XML con il DTD sopra:

<?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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top