Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XML-Schema / XML-Verarbeitung ohne vorherige Validierung? / DTD

DTD

DTD

➪ Eine DTD (document type definition) legt die zulässigen Namespaces, Elemente und Attribute eines XML-Dokuments fest und definiert so die Struktur aller XML-Dokumente, die gegen diese DTD gültig sein sollen.

Auf dieser Seite:

Eine DTD kann im XML-Dokument selber definiert werden, ebenso aber auch als externe Datei. Eine DTD ist selbst kein XML-Dokument, und es kann auch keine Datentypen für die Textinhalte (string, integer, double, dateTime, boolean, ...) definieren.

Ein Element kann als EMPTY, ANY oder mit einer Anzahl Kindknoten (#PCDATA), (child1,child2,...), (childx+), (childy*), (childz?), (child1|child2) deklariert werden. Parsed character data (PCDATA) werden geparst, im Gegensatz zu CDATA. PCDATA können Textinhalte, aber keine Kind-Elemente haben. Die Zeichen +, *, ?, | bedeuten:

? Das Element ist optional.
+ Das Element kann mehrfach (mindestens einmal) auftreten (mandantory).
* Das Element ist optional, kann aber auch mehrfach auftreten.
| Choice: Entweder dieses oder das andere Element kann auftreten.
Keine Angabe Das Element muss genau einmal auftreten.

Beispiele:


<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT Persons (Person*)>
<!ELEMENT Person (Name, Firstname+, Age?)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Firstname (#PCDATA)>
<!ELEMENT Age (#PCDATA)>

"Persons.dtd" definiert die Dokumentstruktur für das folgende Beispiel-XML-Dokument:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Persons SYSTEM "Persons.dtd">
<Persons>
  <Person>
    <Name>Ratlos</Name>
    <Firstname>Rosi</Firstname>
    <Firstname>Renate</Firstname>
    <Alter>55</Alter>
  </Person>
</Persons>

XSL: Generieren von XML-Beispieldateien

Wenn Sie mithilfe von XSL eine ganze Anzahl von XML-Beispieldateien generieren wollen, die nach derselben dtd valide sein sollen, dann können Sie so vorgehen (hier am Beispiel einer DITA-Datei, die Liste der zu generierenden Dateien kommt in diesem Fall aus der Variablen v):


<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:variable name="v">
    <werte>
      <wert>Datei1</wert>
      <wert>Datei2</wert>
      <wert>Datei3</wert>
    </werte>
  </xsl:variable>
  <xsl:template match="/">
    <xsl:for-each select="$v//wert">
      <xsl:result-document 
           href="Pfad_zurXML_Datei/_testdatei{./text()}.xml">
        <xsl:value-of disable-output-escaping="yes"
          select="'&lt;!DOCTYPE topic PUBLIC 
                   &quot;-//OASIS//DTD DITA Topic//EN&quot; 
                   &quot;Zielpfad/dtd/topic.dtd&quot;&gt;'"/>
        <topic id="h0" xml:lang="de-de">
          <title>
            <xsl:value-of select="."/>
          </title>
          <shortdesc>info zu 
             <xsl:value-of select="."/>
          </shortdesc>
          <prolog>
            <metadata>
              <keywords>
                <keyword>
                  <xsl:value-of select="."/>
                </keyword>
              </keywords>
            </metadata>
          </prolog>
          <body>
            <section>
              <title>
              <xsl:value-of select="."/> Kapitel 1
              </title>
              <p>Text 
                 <i>
                 <xsl:value-of select="."/> 
                 kursiv
                 </i>
                 - Noch mehr Text</p>
              <ul>
                <li>
                  <i>Text kursiv</i>
                </li>
                <li>
                  <b>Text kursiv</b>
                </li>
              </ul>
              <p>Jetzt mit Nummerierung<u/></p>
              <ol>
                <li>
                  <i>Text kursiv</i>
                </li>
                <li>
                  <b>Text kursiv</b>
                </li>
              </ol>
            </section>
          </body>
        </topic>
      </xsl:result-document>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Vorausgesetzt, der Zielpfad zur dtd-Datei ist korrekt, lautet das Ergebnis:


<!DOCTYPE topic 
          PUBLIC "-//OASIS//DTD DITA Topic//EN" 
                 "Zielpfad/dtd/topic.dtd">
<topic id="h0" xml:lang="de-de">
  <title>Datei1</title>
  <shortdesc>info zu Datei1</shortdesc>
  <prolog>
   <metadata>
     <keywords>
      <keyword>Datei1</keyword>
     </keywords>
   </metadata>
  </prolog>
  <body>
   <section>
     <title>Datei1 Kapitel 1</title>
     <p>Text <i>Datei1 kursiv</i>- Noch mehr Text</p>
     <ul>
      <li>
        <i>Text kursiv</i>
      </li>
      <li>
        <b>Text kursiv</b>
      </li>
     </ul>
     <p>Jetzt mit Nummerierung<u/>
     </p>
     <ol>
      <li>
        <i>Text kursiv</i>
      </li>
      <li>
        <b>Text kursiv</b>
      </li>
     </ol>
   </section>
  </body>
</topic>

DTD im Attribute-Style

Auch Attribute können auf diese Weise definiert werden:


<!ATTLIST element-name attribute-name attribute-type default-value>

Zum Beispiel:


<!ATTLIST Buch genre (Sachbuch|Krimis) #REQUIRED> 
<!ATTLIST Buch format (Paperback|Hardcover) "Paperback"> 

wobei

#IMPLIED Das Attribut ist optional.
#REQUIRED Das Attribut ist erforderlich (mandantory).
#FIXED Der Vorgabewert ist konstant.

Beispiel:


<?xml encoding="UTF-8"?>
<!ELEMENT Persons (Person+)>
<!ELEMENT Person EMPTY>
<!ATTLIST Person
  Lastname CDATA #REQUIRED
  Firstname CDATA #IMPLIED>

DTD für Attributsstyle mit Namespaces


<?xml encoding="UTF-8"?>
<!ELEMENT ns1:Persons (wg:Person)>
<!ATTLIST ns1:Persons
  xmlns:ns1 CDATA #FIXED 'www.example.de'>
<!ELEMENT wg:Person EMPTY>
<!ATTLIST wg:Person
  xmlns:wg CDATA #FIXED 'www.wilfried-grupe.de'
  Lastname CDATA #REQUIRED
  Firstname CDATA #REQUIRED>

NOTATION

Daneben können in einer DTD ungeparste Entitäten definiert werden. Das folgende Beispiel verweist auf eine separate Binärdatei wetter.jpg, und NDATA bestimmt, dass das Format JPEG ist.


<!ENTITY weather-map SYSTEM "wetter.jpg" 
     PUBLIC "-//MEGACORP//WEATHER/" NDATA JPEG>

Da NDATA als "Nicht-XML" betrachtet werden kann, ist es erforderlich, auch JPEG in der DTD festzulegen. Diese URIs sind jedoch nicht standardisiert.


<!NOTATION JPEG SYSTEM "image/jpeg" > 
<!NOTATION GIF SYSTEM "image/gif" >

Datenstrukturdefinition mit DTD

DTD ist ein etablierter Standard zur Datenvalidierung. DTD ist selbst kein XML-Dokument.


<!ELEMENT CSV2XML (DS)+>
<!ATTLIST CSV2XML xmlns CDATA 
#FIXED 'https://www.wilfried-grupe.de'>
<!ELEMENT DS (id,name,vorname,Gehalt)>
<!ATTLIST DS pos CDATA #REQUIRED>
<!ELEMENT id (#PCDATA)> 
<!ELEMENT name (#PCDATA)> 
<!ELEMENT vorname (#PCDATA)> 
<!ELEMENT Gehalt (#PCDATA)> 

Eine hierzu passende XML-Struktur würde so aussehen:


<CSV2XML xmlns="https://www.wilfried-grupe.de">
  <DS pos="3">
    <id>76</id>
    <name>Denzschlos</name>
    <vorname>Resi</vorname>
    <Gehalt>123.45</Gehalt>
  </DS>
</CSV2XML>

wg / 5. Juni 2021



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/DTD.html