XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XML-Schema / XML-Verarbeitung ohne vorherige Validierung? / 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>
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="'<!DOCTYPE topic PUBLIC
"-//OASIS//DTD DITA Topic//EN"
"Zielpfad/dtd/topic.dtd">'"/>
<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>
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>
<?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>
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" >
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.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de