DTD: extern + intern möglich?
Robert
- xml
Hallöle,
es gibt doch die zwei Möglichkeiten, im DOCTYPE-Element einerseits auf eine externe DTD zu verweisen und andererseits direkt die Angaben zu machen:
<!DOCTYPE root PUBLIC "MeineTolleDTD" "http://example.org/my.dtd">
oder
<!DOCTYPE root [ <!ELEMENT root (wasauchimmer) > ] > (oder so ähnlich von der Syntax her).
Frage:
Ist es auch möglich, beides zu kombinieren, um praktisch eine bestehende DTD um ein oder zwei Attribute zu ergänzen?
Also sowas:
<!DOCTYPE root PUBLIC "MeineTolleDTD" "http://example.org/my.dtd" [ <!ATTLIST root myattrib CDATA #IMPLIED> ]>
Ist das erlaubt?
Und ist es damit möglich, lokal Attribute für Elemente der nichtlokalen DTD zu ergänzen?
TIA,
Robert
Hi Robert,
Ist es auch möglich, beides zu kombinieren, um praktisch eine bestehende DTD um ein oder zwei Attribute zu ergänzen?
Laut [XML10] ja:
[28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | DeclSep)* ']' S?)? '>'
Aber warum nutzt du nicht verschiedene Namensräume? [XML-NAMES]
Gruß,
Gunnar
Hi,
Laut [XML10] ja:
[28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | DeclSep)* ']' S?)? '>'
Danke.
Das zeigt, daß beides gleichzeitig benutzt werden kann.
Aber leider sagt das nichts darüber aus, ob ich damit eine ATTLIST lokal zusätzlich zur externen ATTLIST (bei denselben Elementen) bauen darf.
Aber warum nutzt du nicht verschiedene Namensräume? [XML-NAMES]
Weil das hieße, daß haufenweise Software angepaßt werden müßte.
Andere Frage (falls das mit 2 ATTLIST pro Element geht):
Gibt es für den Element-Namen sowas wie einen Joker?
Es soll allen Elementen ein bestimmtes Attribut zugefügt werden, ich hätte also gerne sowas wie
<!ATTLIST (*) myattrib CDATA #IMPLIED>
statt
<!ATTLIST (bla|ble|bli|blo|blu) myattrib CDATA #IMPLIED>
(da es sich um sehr viele Elemente handelt, wäre das wesentlich praktischer)
cu,
Andreas
Hi wer denn nun?
Gibt es für den Element-Namen sowas wie einen Joker?
Es soll allen Elementen ein bestimmtes Attribut zugefügt werden, ich hätte also gerne sowas wie
<!ATTLIST (*) myattrib CDATA #IMPLIED>
statt
<!ATTLIST (bla|ble|bli|blo|blu) myattrib CDATA #IMPLIED>
Die Joker nennen sich Parameter-Entities. [XML10 §4]
Die (X)HTML-DTDs verwenden sie zahlreich.
Gruß,
Gunnar
Hi,
Hi wer denn nun?
Ich. Mein Rechner wurde vom Nachbarn benutzt.
Gibt es für den Element-Namen sowas wie einen Joker?
Es soll allen Elementen ein bestimmtes Attribut zugefügt werden, ich hätte also gerne sowas wie
<!ATTLIST (*) myattrib CDATA #IMPLIED>
statt
<!ATTLIST (bla|ble|bli|blo|blu) myattrib CDATA #IMPLIED>Die Joker nennen sich Parameter-Entities. [XML10 §4]
Das nutzt aber nichts. Im Gegenteil.
Statt nur die Elemente aufzulisten, müßte ich dann erst noch eine Parameter-Entity definieren mit der kompletten Auflistung, um sie dann genau einmal zu verwenden. Nicht sehr effektiv.
cu,
Andreas
Hallo Hacker, :-)
Danke.
Das zeigt, daß beides gleichzeitig benutzt werden kann.
Aber leider sagt das nichts darüber aus, ob ich damit eine ATTLIST lokal zusätzlich zur externen ATTLIST (bei denselben Elementen) bauen darf.
Darfst du.
Du kannst für jedes Attribut ein eigenes <!ATTLIST> erstellen.
Du kannst in der internen Teilmenge der DTD auch teile der externen Teilmenge überschreiben. Regel: die Angaben in der interne Teilmenge haben immer den Vorrang.
Andere Frage (falls das mit 2 ATTLIST pro Element geht):
Gibt es für den Element-Namen sowas wie einen Joker?
Nein.
Es soll allen Elementen ein bestimmtes Attribut zugefügt werden, ich hätte also gerne sowas wie
<!ATTLIST (*) myattrib CDATA #IMPLIED>
statt
<!ATTLIST (bla|ble|bli|blo|blu) myattrib CDATA #IMPLIED>
(da es sich um sehr viele Elemente handelt, wäre das wesentlich praktischer)
Tja ... jetzt geht es entweder so, oder mit Überarbeitung der DTD:
<!ENTITY % allg.attrib
" myattrib CDATA #IMPLIED
">
<!ATTLIST element
%allg.attrib;
...
Wenn dann nochmal ein Attribut für alle Elemente kommen soll: einfach die Parameterentity erweitern und so ist die Sache erledigt.
Grüße
Thomas
Hi,
Hallöle,
Hi Robert,
wenn Du schon meinen Rechner benutzt, log Dich doch bitte wieder aus - sprich: beende den Firefox.
Ich hatte Dir doch extra mal Deinen heißgeliebten Opera installiert.
cu,
Andreas
hi,
Hi Robert,
wenn Du schon meinen Rechner benutzt, log Dich doch bitte wieder aus - sprich: beende den Firefox.
ja, die konsequente trennung zwischen zwei in einem kopf wohnenden persönlichkeiten ist nie eine leichte aufgabe ...
scnr,
wahsaga
Hi,
Hi Robert,
wenn Du schon meinen Rechner benutzt, log Dich doch bitte wieder aus - sprich: beende den Firefox.ja, die konsequente trennung zwischen zwei in einem kopf wohnenden persönlichkeiten ist nie eine leichte aufgabe ...
Mein Nachbar (Robert) benutzt manchmal meinen Rechner, da er Probleme mit dem Internet-Zugang hat (sein Modem spinnt manchmal).
cu,
Andreas
Hallo Robert,
Frage:
Ist es auch möglich, beides zu kombinieren, um praktisch eine bestehende DTD um ein oder zwei Attribute zu ergänzen?
"If both the external and internal subsets are used, the internal subset MUST be considered to occur before the external subset. This has the effect that entity and attribute-list declarations in the internal subset take precedence over those in the external subset."
Quelle: < http://www.w3.org/TR/REC-xml/#sec-prolog-dtd>
Es ist also möglich, die in der DTD zu überschreiben. Wenn Du sie erweitern willst, musst Du aber Parameter-Entities verwenden.
Zu dem Vorschlag mit den Namespaces:
DTDs unterstüzen keine Namespaces, von daher artet es oft in gepfusche aus, wenn man Namespaces und DTDs gemeinsam verwendet. Das W3C stellt zwar für viele XML-Anwendungen auch DTDs zur verfügung, damit kann man dann aber auch Namespaces nicht wirklich vernünftig verwenden.
Abgesehen davon beheben sie nicht das Problem, eine DTD zu erweitern.
Grüße
Daniel