ThomasM: | bei Elementen (nicht ihren Attributen)

Beitrag lesen

Hallo Klaus,

<!ELEMENT (Auftraggeber|Empfaenger) (Name?,Bank,KtoNr)>

Bedeutet der senkrechte Strich in diesem Fall auch entweder das Element Auftraggeber oder das Element Empfaenger?

Ja, allerdings ist diese Element-Deklaration fehlerhaft, weil ein Klammerausdruck für das jweilige Inhaltsmodell steht und zunächst der Elementname erforderlich ist. Das könnte so aussehen:

<?xml version="1.0" encoding="ISO-8859-1"?>  
<!DOCTYPE Ueberweisungen [  
  <!ELEMENT Ueberweisungen (Ueberweisung+)>  
  <!ELEMENT Ueberweisung (Auftraggeber | Empfaenger)>  
  <!ELEMENT Auftraggeber (Name?, Bank, KtoNr)>  
  <!ELEMENT Empfaenger (Name?, Bank, KtoNr)>  
  <!ELEMENT Name (#PCDATA)>  
  <!ELEMENT Bank (#PCDATA)>  
  <!ELEMENT KtoNr (#PCDATA)>  
]>  
<Ueberweisungen>  
  <Ueberweisung>  
    <Auftraggeber>  
      <Name>...</Name>  
      <Bank>...</Bank>  
      <KtoNr>...</KtoNr>  
    </Auftraggeber>  
  </Ueberweisung>  
</Ueberweisungen>

Wobei es praktisch sinnvoller wäre, sowohl Auftraggeber als auch Empfaenger zuzulassen, also in der Form:
<!ELEMENT Ueberweisung (Auftraggeber, Empfaenger)>

Wenn es darum geht, die Deklaration für "Name?,Bank,KtoNr" nur 1x zu notieren, dann wäre dieses Vorgehen mit Parameter-Entity geeignet (allerdings nur bei externer DTD-Verwendung):

<?xml version="1.0" encoding="ISO-8859-1"?>  
<!DOCTYPE Ueberweisungen SYSTEM "ueberweisung.dtd">  
<Ueberweisungen>  
  <Ueberweisung>  
    <Auftraggeber>  
      <Name>...</Name>  
      <Bank>...</Bank>  
      <KtoNr>...</KtoNr>  
    </Auftraggeber>  
  </Ueberweisung>  
</Ueberweisungen>

mit ueberweisung.dtd:

<!ENTITY % nbk "Name?, Bank, KtoNr">  
<!ELEMENT Ueberweisungen (Ueberweisung+)>  
<!ELEMENT Ueberweisung (Auftraggeber | Empfaenger)>  
<!ELEMENT Auftraggeber (%nbk;)>  
<!ELEMENT Empfaenger (%nbk;)>  
<!ELEMENT Name (#PCDATA)>  
<!ELEMENT Bank (#PCDATA)>  
<!ELEMENT KtoNr (#PCDATA)>

Grüße,
Thomas