Jan Hillebrand: XSLT-ähnliche DTD

Guten Tag.

Ich möchte einen neuen XML-Dialekt entwickeln. Eigentlich handelt es sich nur um wenige Elemente. Das ganze sollte ungefähr so funktionieren wie XSLT, sprich es gibt ein XML-Oberelement in dem HTML Elemente auftauchen können in denen wiederrum bestimmte XML Elemente enthalten sein können. Beispiel:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pml SYSTEM "pml2.dtd">
<pml xmlns:pml="http://www.die-namespace-adresse.de/">
   pml:processing
      <pml:variable name="title">
         Dokumententitel
      </pml:variable>
      <pml:variable name="content">
         GoForRight01 =
         <pml:insert name="GoForRight01" source="system" />
      </pml:variable>
   </pml:processing>
   pml:body
      <html>
         <head>
            <title>
               <pml:insert name="title" source="pml" />
            </title>
        </head>
        <body>
           <!-- Inhalt -->
           <pml:insert name="content" source="pml" />
        </body>
      </html>
   </pml:body>
</pml>

Wenn ich das allerdings in meinem XML Editor validieren lasse gibt es einen Fehler. Dies ist auch logisch, denn in der XHTML 1.0 DTD existieren die PML Elemente ja nicht. Allerdings geht das oben gennante beispiel ja in XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="/">
      <html>
         <xsl:apply-templates />
      </html>
   </xsl:template>
</xsl:stylesheet>

Ich konnte im Internet keine DTD für XSLT finden. Meine Frage ist, wie ich es in meiner PML DTD hinbekomme, dass das oben angeführte funktionieren würde. Rein theoretisch müsste ich ja dafür eine Änderung der XHTML DTD vorhnehmen, aber ich hoffe es gibt auch einen anderen Weg?
Ich habe mir in meinem XML Edior einmal das Model der Elemente angesehen. Zum Beispiel bei pml:variable lautet das Model

"(#PCDATA | pml:insert)*".

Bei xsl:variable lautet das Model

"(xsl:apply-templates | xsl:call-template | xsl:apply-imports | xsl:for-each | xsl:value-of | xsl:copy-of | xsl:number | xsl:choose | xsl:if | xsl:text | xsl:copy | xsl:variable | xsl:message | xsl:fallback | xsl:processing-instruction | xsl:comment | xsl:element | xsl:attribute){0-UNBOUNDED}"

Stutzig wurde ich über das {0-UNBOUNDED}. Ich hab dann versucht in meiner DTD zu schreiben

<!ELEMENT pml:variable (#PCDATA | pml:insert){0-UNBOUNDED}>
<!ATTLIST pml:variable
   [...]>

Doch dann sagte mir der Editor "The mixed content model "pml:variable" must end with ")*" when the types of child elements are constrained."

Ich stehe also weiterhin auf dem Holzweg.
Ich hoffe mir kann jemand helfen?

Vielen Dank.

Gruß,
Jan Hillebrand

  1. Hi,

    Ich konnte im Internet keine DTD für XSLT finden.

    Es gibt meines Wissens keine.

    Kann vom Prinzip her auch kaum eine geben - XSLT erlaubt an fast allen Stellen beliebige Elemente beliebiger anderer XML-Sprachen.
    Und in den Elementen dieser anderen Sprachen kommen dann wieder fast beliebig XSLT-Elemente vor.

    Wie willst Du das sinnvoll in Form einer DTD aufschreiben?

    Meine Frage ist, wie ich es in meiner PML DTD hinbekomme, dass das oben angeführte funktionieren würde.

    Vermutlich genausowenig.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi,

      das es keine DTD für XSLT geben kann ist mir bewusst. Es gibt beim W3C einen Ausschnitt einer möglichen XSLT DTD. Allerdings bleiben dort das Entity result-elements auch offen.
      Wie auch immer, kann ich daraus schließen, dass ich keine DTD Entwickeln kann, die meinen Ansprüchen entsprechen würde?
      Ich werde die PML Dateien mit einem Java Programm verarbeiten, welches die Tags durch bestimmte Angaben ersetzt, insofern ist die Existenz einer gültigen DTD nicht ausschlaggebend, allerdings hätte ich trotzdem gerne eine Erstellt.
      Falls es doch eine Möglichkeit gibt würde ich mich über eine Antwort freuen.

      Gruß,
      Jan.

  2. Hallo,

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE pml SYSTEM "pml2.dtd">
    <pml xmlns:pml="http://www.die-namespace-adresse.de/">
       pml:processing

    »»

    </body>
          </html>
       </pml:body>
    </pml>

    Wenn ich das allerdings in meinem XML Editor validieren lasse gibt es einen Fehler. Dies ist auch logisch, denn in der XHTML 1.0 DTD existieren die PML Elemente ja nicht.

    Ich finde nicht, dass das logisch ist. Wie kommt XHTML überhaupt ins spiel, wenn du weder einen Namensraum geschweige die XHTML-DTD verwendest? --> *
    Wenn dein Dokument nicht validiert, dann weil es nicht deiner DTD entspricht.

    Allerdings geht das oben gennante beispiel ja in XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
       <xsl:template match="/">
          <html>
             <xsl:apply-templates />
          </html>
       </xsl:template>
    </xsl:stylesheet>

    * --> Das ist eine ganz andere Baustelle und hier ist es auch logisch. ;-) Hier sind die HTML-Elemente (wie auch in deinem XML übrigens) im Null-Namensraum (bzw. in keinem Namensraum) und gelten als Literale Ergebniselemente (du könntest statt <html>, <xsl:element name="html"> schreiben.)

    Ich konnte im Internet keine DTD für XSLT finden.

    Wurde schon beantwortet.

    Meine Frage ist, wie ich es in meiner PML DTD hinbekomme, dass das oben angeführte funktionieren würde.

    Mit Zeit und Aufwand und mit der "Modularization of XHTM" http://www.w3.org/TR/xhtml-modularization/ wäre das möglich.

    »»Rein theoretisch müsste ich ja dafür eine Änderung der XHTML DTD vorhnehmen, aber ich hoffe es gibt auch einen anderen Weg?

    Das kannst du zwar machen, aber ich glaube nicht, dass dir der Aufwand dafür wirklich bewusst ist.

    Ich habe mir in meinem XML Edior einmal das Model der Elemente angesehen.

    In welchem Editor?

    Stutzig wurde ich über das {0-UNBOUNDED}. Ich hab dann versucht in meiner DTD zu schreiben

    Das ist wohl eine Editor interne Syntax. DTD-Syntax ist das nicht.

    Ich stehe also weiterhin auf dem Holzweg.
    Ich hoffe mir kann jemand helfen?

    https://forum.selfhtml.org/?t=116015&m=741816
    "Es gibt beim W3C einen Ausschnitt einer möglichen XSLT DTD. Allerdings bleiben dort das Entity result-elements auch offen."

    Du kannst natürlich versuchen aus der DTD-Fragment in der XSLT-Spezifikation eine eigene DTD zu erstellen:

    <!ENTITY % xhtml.dtd SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     %xhtml.dtd;

    <!ENTITY % result-elements "
    %special.extra;
    und alle weitere Element-Entities aus der XHTML-DTD
    ">

    Aber dies gilt für XSL und nicht für dein XML, es sei denn du baust deine DTD ziemlich ähnlich auf.

    Besser wärst du drann, wenn du dir die "Modularisierung von XHTML" http://edition-w3c.de/TR/2001/REC-xhtml-modularization-20010410/ anschaust. Wie gesagt Zeit und Aufwand.

    Grüße
    Thomas

  3. <!DOCTYPE pml SYSTEM "pml2.dtd">
    <pml xmlns:pml="http://www.die-namespace-adresse.de/">
       pml:processing

    Jan,
    Warum gehört dein Wurzelelement pml keinem Namensraum an?

    Besse wäre wohl

    <!DOCTYPE pml:pml SYSTEM "pml2.dtd">  
    <pml:pml xmlns:pml="http://www.die-namespace-adresse.de/">  
       <pml:processing>
    


    </pml:pml>

    Live long and prosper,
    Gunnar

    --
    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)