Andi: Zwei DTD's für ein Ausgabedokument erzeugen

Hallo zusammen,

ich transformiere derzeit XML mit einer XSLT-Transfomation in SVG und habe dabei folgendes Problem bzw. Frage:
Ist es möglich ein XSLT-Stylesheet zu erzeugen, das 2 DTD's auf ein SVG Dokument angewendet werden?

Im XSLT-Stylesheet deklariere ich im xsl:output doctype-public und doctype-system. Allerdings kann man keine weiteren DTD's angeben.

In SVG ist es dies möglich, indem man in die neuen Attribute zum Beispiel wie folgt anfügt und den Namensraum im svg-Element deklariert:
<!DOCTYPE svg
  PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd"
[<!ATTLIST svg
xmlns:attrib CDATA #IMPLIED

]>

So sollte das SVG durch XSLT erzeugt werden, was mir bis jetzt noch nicht gelungen ist.

Hintergrund zu der ganze Sache ist folgender. Ich erzeuge innerhalb des SVG's Elemente, die ich für ein JavaScript benötige. Da diese Elemente nicht im SVG-Namensraum enthalten sind, bekomme ich bei der Validierung eine Fehlermeldung. Daher wollte ich einen weiteren Namensraum angeben, die diese Elemente mit den zugehörigen Attributen enthalten.
Ich versucht die Elemete auszukommentieren, dann greift das JavaScript jedoch nicht mehr darauf zu. Aber vielleicht es es einfacher das JAvaScript umzuprogrammieren als 2 DTD's zu erzeugen?

Beste Grüße

Andi

  1. Hallo,

    ich transformiere derzeit XML mit einer XSLT-Transfomation in SVG und habe dabei folgendes Problem bzw. Frage:
    Ist es möglich ein XSLT-Stylesheet zu erzeugen, das 2 DTD's auf ein SVG Dokument angewendet werden?

    Du kannst immer nur eine DTD verwenden. (die internete Untermenge ist keine 2. DTD)

    Im XSLT-Stylesheet deklariere ich im xsl:output doctype-public und doctype-system. Allerdings kann man keine weiteren DTD's angeben.

    In SVG ist es dies möglich, indem man in die neuen Attribute zum Beispiel wie folgt anfügt und den Namensraum im svg-Element deklariert:
    <!DOCTYPE svg
      PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd"
    [<!ATTLIST svg
    xmlns:attrib CDATA #IMPLIED

    ]>

    So sollte das SVG durch XSLT erzeugt werden, was mir bis jetzt noch nicht gelungen ist.

    Das ginge nur z.B. so:

    <xsl:output method="xml" indent="yes" encoding="iso-8859-1" />

    <xsl:template match="/">
     <xsl:text disable-output-escaping="yes">
     <![CDATA[
      <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd"
       [<!ATTLIST svg
       xmlns:attrib CDATA #IMPLIED
       >
      ]>
     ]]>
     </xsl:text>

    <!-- aber hier dann den Rest mit <svg> ... erzeugen -->
    </xsl:template>

    Oder ohne "disable-output-escaping" und CDATA, dann musst du zumindest die < als &lt; notieren.

    Grüße
    Thomas

    1. Hallo,

      ich transformiere derzeit XML mit einer XSLT-Transfomation in SVG und habe dabei folgendes Problem bzw. Frage:
      Ist es möglich ein XSLT-Stylesheet zu erzeugen, das 2 DTD's auf ein SVG Dokument angewendet werden?

      Du kannst immer nur eine DTD verwenden. (die internete Untermenge ist keine 2. DTD)

      Im XSLT-Stylesheet deklariere ich im xsl:output doctype-public und doctype-system. Allerdings kann man keine weiteren DTD's angeben.

      In SVG ist es dies möglich, indem man in die neuen Attribute zum Beispiel wie folgt anfügt und den Namensraum im svg-Element deklariert:
      <!DOCTYPE svg
        PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd"
      [<!ATTLIST svg
      xmlns:attrib CDATA #IMPLIED

      ]>

      So sollte das SVG durch XSLT erzeugt werden, was mir bis jetzt noch nicht gelungen ist.

      Das ginge nur z.B. so:

      <xsl:output method="xml" indent="yes" encoding="iso-8859-1" />

      <xsl:template match="/">
      <xsl:text disable-output-escaping="yes">
      <![CDATA[
        <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd"
         [<!ATTLIST svg
         xmlns:attrib CDATA #IMPLIED
         >
        ]>
      ]]>
      </xsl:text>

      <!-- aber hier dann den Rest mit <svg> ... erzeugen -->
      </xsl:template>

      Oder ohne "disable-output-escaping" und CDATA, dann musst du zumindest die < als &lt; notieren.

      Grüße
      Thomas

      Besten Dank,

      hab schon ein paar CData Blöcke bei mir in dem XSLT, nur habe ich sie in diesem Fall immer an die falsche Stelle gesetzt...
      Als Ergebnis bekomme ich nun jedoch zweimal
      <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd"
           [<!ATTLIST svg
          xmlns:attrib CDATA #IMPLIED
         >
         <!ATTLIST path
         attrib:font-family CDATA #IMPLIED
         attrib:name CDATA #IMPLIED
         >
         ]>

      <!DOCTYPE svg
        PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd">
      Wo wird denn der Doctype definiert? Denn, wenn man ihn beim xsl:output herausnimmt, wird er trotzdem 2x aufgeführt? Kann es sein, das der doctype durch das svg-Element automatisch gesetzt wird?

      Beste Grüße

      Andi

      1. »

        Besten Dank,

        hab schon ein paar CData Blöcke bei mir in dem XSLT, nur habe ich sie in diesem Fall immer an die falsche Stelle gesetzt...
        Als Ergebnis bekomme ich nun jedoch zweimal
        <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd"
             [<!ATTLIST svg
            xmlns:attrib CDATA #IMPLIED
           >
           <!ATTLIST path
           attrib:font-family CDATA #IMPLIED
           attrib:name CDATA #IMPLIED
           >
           ]>

        <!DOCTYPE svg
          PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd">
        Wo wird denn der Doctype definiert? Denn, wenn man ihn beim xsl:output herausnimmt, wird er trotzdem 2x aufgeführt? Kann es sein, das der doctype durch das svg-Element automatisch gesetzt wird?

        Beste Grüße

        Andi

        Hallo nochmal,

        habe meinen Fehler gefunden. Jetzt funktionierts. Besten Dank nochmals!