DTD Erweitern
Marcus
- xml
0 Thomas J.S.0 Marcus
Hallo zusammen,
bin leider recht neu im XML/ DTD Sektor und habe einige Probleme.
Wie nutzen eine DTD die den X3D Standard beschreibt und wollen/müssen sie für unsere Zwecke und den internen Gebrauch erweitern. Am liebsten wäre mir natürlich eine separate DTD, die ich bei Bedarf dazulinke.
Unter diesem Link ist das Orignial:http://www.web3d.org/specifications/x3d-3.0.dtd
Ich möchte zwei neue Element-Typen definieren, die aber nur als Kinder des Elementes "Shape" auftauchen dürfen. Was ich bis jetzt gemacht habe ist folgendes:
1. Ich habe die Elemente definiert mit
<!ELEMENT SimulationBehaviour EMPTY>
<!ATTLIST SimulationBehaviour
code CDATA #IMPLIED
DEF CDATA #IMPLIED
containerField NMTOKEN ""
class CDATA ""
DEF ID #IMPLIED
<!ELEMENT InteractionBehaviour EMPTY>
<!ATTLIST InteractionBehaviour
code CDATA #IMPLIED
DEF CDATA #IMPLIED
containerField NMTOKEN ""
class CDATA ""
DEF ID #IMPLIED
2. Dann habe ich zwei Entities für die beiden definiert mit:
<!ENTITY % MyComponent "INCLUDE">
und
<![%MyComponent "
<!ENTITY % Java3DBehaviourNodes " SimulationBehaviour | InteractionBehaviour |">
]]>
Was mich verwirrt, ist die Tatsache, dass die DTD mit Profilen (siehe Link) arbeitet.
Wie schaffe ich es jetzt noch, dass meine beiden neuen Elemente in alles Profilen nur als Kinder des Elementes "Shape" eingefügt werden dürfen?
Danke
Marcus
Hallo,
Am liebsten wäre mir natürlich eine separate DTD, die ich bei Bedarf dazulinke.
Das ist verständlich.
Was ich bis jetzt gemacht habe ist folgendes:
- Ich habe die Elemente definiert
- Dann habe ich zwei Entities für die beiden definiert mit:
<!ENTITY % MyComponent "INCLUDE">
<![%MyComponent "
<!ENTITY % Java3DBehaviourNodes " SimulationBehaviour | InteractionBehaviour |">
]]>
So weit ist so gut oder so schlecht
2)diese Varainte könntest du nur tatsächlich in einer externen DTD ablegen und nur so verwenden:
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?
<!DOCTYPE rootelement SYSTEM "http://www.web3d.org/specifications/x3d-3.0.dtd" [
<!ENTITY % meine.modul SYSTEM "pfad_zu_deiner.dtd" >
%meine.modul;
]>
<rootelement>
...
</rootelement>
Da hast du aber noch immer nicht das was du möchtest.
Was mich verwirrt, ist die Tatsache, dass die DTD mit Profilen (siehe Link) arbeitet.
Tut sie nicht, da es in DTDs keine Profile gibt, dass sie das so nennen sollte lediglich die Handhabung und das Verständnis der DTD leichter machen, was bei vielen konditionalen Bereichen auch notwendig ist.
Wie schaffe ich es jetzt noch, dass meine beiden neuen Elemente in alles Profilen nur als Kinder des Elementes "Shape" eingefügt werden dürfen?
So wie es du dir wünschst gar nicht: weil auch eine externe zusatz DTD könntest du nur in der internen DTD-Untermenge in den XML-Dateien einfügen. (siehe oben)
Die interne Untermente wird aber immer zuerst gelesen und hat vor der externen Untermenge den Vorrang, d.h. deine DTD wird erst eingelsen und dann erst die DTD von web3d.
Schau dir die Elementdaklaration für Shape an (hier das Wesenliche):
<![%ImmersiveProfile;[
<!ELEMENT Shape (IS?, (
( (%AppearanceNodes;), (( %GeometryNodes; ) | %WildcardNodes;)? ) |
( ( %GeometryNodes; ), ((%AppearanceNodes;) | %WildcardNodes;)? ) |
( %WildcardNodes;, (( %GeometryNodes; ) | (%AppearanceNodes;) | %WildcardNodes;)? )
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT Shape (
( (%AppearanceNodes;), ( %GeometryNodes; )? ) |
( ( %GeometryNodes; ), (%AppearanceNodes;)? )
)? >
]]>
Laute Parameter-Entities: wenn du jetzt diese Definitionen in deiner DTD kopiert und sie in deiner DTD-Untermenge um deine %Java3DBehaviourNodes; erweitern würdest, würde dir jede Parser meckern, dass die anderen Paramter-Entities nicht deklariert worden sind.
Du kannst nur eines Machen:
Die gesamte DTD holen und darin deine Erweiterungen machen, ein konditionaler Bereicht lohnt sich in diesem Fall nicht bzw. könntest du gar nicht machen. Dann müsstest du die Elementdeklaration vom Shape erweitern
Also
b) du setzt das vohandene Deklarationen für Shape auf IGNORE (es gibt sie nur zwei mal)
<![%Original;[
<!ELEMENT Shape (IS?, ( ... ) >
]]>
und
<![%Original;[
<!ELEMENT Shape ( ... )
)? >
]]>
c) du kopierst diese zwei konditionalen bereiche, machst du darin deine Erweiterungen und setzt du sie auf INCLUDE:
<![%MyComponent;[
<!ELEMENT Shape (IS?, ( ... ) >
]]>
und
<![%MyComponent;[
<!ELEMENT Shape ( ... )
)? >
]]>
------------------------------------
Was die Erweitrung von Shape angeht, muss du dazu die beiden Inhaltsmodelle für Shape verstehen, denn wo genau deine Elemente innerhalb von Shape vorkommen dürfen muss du selber wissen. Du kannst dann an der richtigen Stelle (%Java3DBehaviourNodes;) notieren.
Zu Bedenken wäre, dann noch auch, dass bei einem Wechsel von:
<!ENTITY % ImmersiveProfile "INCLUDE">
<!ENTITY % InterchangeProfile "IGNORE">
Deine Erweiterungen ignoriert bzw. davon nicht betroffen werden.
Dem könntest du mit einer Verschachtelung der konditionalen Bereiche für Shape begegnen, was an sich die vernünftigeste wäre:
<![%ImmersiveProfile;[
<![%Original;[
Die gesamte alte Deklarationen, von ImmersiveProfile;
]]>
<![%MyComponent;[
Die Gesamte neue Deklaration, mit deiner erweiterung von Shape
]]>
]]>
und das ganze natürlich nochmal für
<![%InterchangeProfile;[ ... ]]> wo Shape drinn war.
----------------
Wenn du jetzt das Oriniganl DTD verwenden willst
kannst du es mit einen Wechsel tun
<!ENTITY % MyComponent "IGNORE">
<!ENTITY % Original "INCLUDE">
Vorteil dieser Veschachtelung, dass alle anderen Funktionen (IGNORE, INCLUDE) mitberücksichtigt werden.
Grüße
Thomas
Erstmal vielen, vielen Dank für deine ausführliche Antwort. Die werde ich mir Morgen erstmal "auf der Zunge zergehen lassen" ;-)
Es fehlt mir noch "ein wenig" an Verständnis für die Zusammenhänge, da ich mich erst seit gestern mit dtd's beschäftige :-(
Das kriege ich heute nicht mehr hin. Aber Morgen bei einem Kaffee...
Danke erstmal
Gruß
Marcus
Hallo Marcus,
Es fehlt mir noch "ein wenig" an Verständnis für die Zusammenhänge, da ich mich erst seit gestern mit dtd's beschäftige :-(
Das kriege ich heute nicht mehr hin. Aber Morgen bei einem Kaffee...
Du meldest dich einfach wenn du fragen hast. ;-)
Grüße
Thomas