Gleiche Elementnamen ohne Namensraum

daniel665

Grünschnabel
Zum folgendem xml Dokument soll ein dieses vallidierendes DTD Fragment erstellt werden.
Problem: Für <titel> sind keine namespaces deklariert.
Frage: Wie ist es möglich ohne namespaces ein vallidierendes DTD Fragment für folgendes xml Dokument (DocBook) zu erstellen?

<?xml version="1.0" ?>
<!DOCTYPE book SYSTEM "docbookx.dtd">
<?xml-stylesheet type="text/xsl" href="docbook.xsl"?>
<!--Dies ist ein DocBook-Dokument-->
<book lang="de">
<titel>Ein sehr einfaches Buch</titel>
<chapter>
<title>Einf&uuml;hrung DocBook</title>
<!--Titel können in Docbook auf unterschiedlichen Hirarchieebenen stehen-->
<para>So ist das also</para>
<figure>
<title>An Example Node Tree</title>
<graphic fileref="figures/node-tree.png"/>
</figure>
</chapter>
</book>

Lösungsversuch:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT book (titel* , chapter)>
<!ATTLIST book
lang (de | en) #REQUIRED>
<!ELEMENT titel (#PCDATA)>
<!ELEMENT chapter (titel*,para?,figure)>
<!ELEMENT para (#PCDATA)>
<!ELEMENT figure (title* , graphic)>
<!ELEMENT graphic (#PCDATA)>
<!ATTLIST graphic fileref CDATA #REQUIRED>

Fehlermeldung:
Das Inhaltsmodell vom Element<chapter> lässt das Element <titel> an dieser Stelle nicht zu.
 
Hi

das geht doch wunderbar, wenn immer title oder immer titel verwendet. Wenn man es vermischt kann es nicht gehen.

Die Sterne am "title" sind nicht nötig, die stehen für 0 bis n Vorkommen an DIESER Stelle nicht im ganzen Dokument. Nachfolgends File validiert bei mir sauber:

XML:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE book [
	<!ELEMENT book (title , chapter)>
	<!ATTLIST book
	lang (de | en) #REQUIRED>
	<!ELEMENT title (#PCDATA)>
	<!ELEMENT chapter (title,para?,figure)>
	<!ELEMENT para (#PCDATA)> 
	<!ELEMENT figure (title , graphic)>
	<!ELEMENT graphic (#PCDATA)>
	<!ATTLIST graphic fileref CDATA #REQUIRED>

]>

<!--Dies ist ein DocBook-Dokument-->
<book lang="de">
	<title>Ein sehr einfaches Buch</title>
	
	<chapter>
		<title>Einführung DocBook</title>
		
		<para>So ist das also</para>
		<figure>
			<title>An Example Node Tree</title>
			<graphic fileref="figures/node-tree.png"/>
		</figure>
	</chapter>
</book>
 
Zuletzt bearbeitet von einem Moderator:
wenn nicht hier wann brauch ich dann Namensräume?

Hier ist es nicht notwendig mit Namensräumen zu arbeiten, weil es sich immer um den selben "title" handelt. Sprich erhat immer die selbe Struktur, nämlich #PCDATA.

Namensräume braucht man (vereinfacht gesagt), wenn zwei Dinge unterschiedlicher Struktur den gleichen Namen haben (und aufeinandertreffen).


Stell Dir zwei XML-Files vor :

File 1

XML:
<person>
  <name>
    <vorname>John</vorname>
    <nachname>Doe</nachname>
  </name>
</person>

File 2

XML:
<firma>
  <name>Mayer KG</name>
</firma>


und jetzt bringst Du die zwei Files zusammen, zu Firmen mit Ansprechpartnern z.B.

Dann brauchst Du Namesräume

XML:
<f:firma xmlns:f="urn::firma" xmlns:p="urn::person">
  <f:name>Mayer KG</f:name>
  <p:person>
    <p:name>
      <p:vorname>John</p:vorname>
      <p:nachname>Doe</p:nachname>
    </p:name>
  </p:person>
</f:firma>

Um die zwei Sorten von Namen zu unterscheiden.

Dieses spezielle Problem ließ sich jetzt auch ohne Namesräume mit lokalen Definitionen lösen und dient nur dem Grundverständnis, anders sieht es aber aus, wenn Du eigene Typen definierst, oder gar eigene Sprachen wie XSLT, XSD o.ä. dann kommst Du ohne eigene Namespaces nicht mehr aus.

Grüße
 
Zuletzt bearbeitet von einem Moderator:
Zurück