Verwenden der Kopie mit document () zum Hinzufügen von SVGs zur XHTML-Ausgabe

113

Während der Verarbeitung meines XML versuche ich, eine SVG-Datei, auf die von einem hrefAttribut verwiesen wird, mit der folgenden Zeile direkt in mein Ausgabe-HTML zu kopieren :

 <xsl:copy-of copy-namespaces="yes" select="document(@href)"/>

Das copy-namespacessollte nicht notwendig sein, da der Standardwert sowieso "Ja" ist, aber ich habe ihn hinzugefügt, um Fragen zu vermeiden, ob ich es versucht habe oder nicht.

Die Dateien werden in den HTML-Code kopiert, aber alle Elemente mit Namespace werden abgespritzt. Beispiel: Eine Datei, die vor dem Kopieren folgendermaßen aussieht:

  <rdf:RDF>
      <cc:Work rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
        <dc:title/>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g transform="translate(-519.21143,-667.79077)" id="layer1">
    <image xlink:href="data:image/png;base64

Sieht danach so aus:

  <_0:RDF xmlns:_0="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <_0:Work xmlns:_0="http://creativecommons.org/ns#" about="">
        <_0:format xmlns:_0="http://purl.org/dc/elements/1.1/">image/svg+xml</_0:format>
        <_0:type xmlns:_0="http://purl.org/dc/elements/1.1/" resource="http://purl.org/dc/dcmitype/StillImage"/>
        <_0:title xmlns:_0="http://purl.org/dc/elements/1.1/"/>
      </_0:Work>
    </_0:RDF>
  </metadata>
  <g id="layer1" transform="translate(-519.21143,-667.79077)">
    <image href="data:image/png;base64

Der fehlende xlink-Namespace für den hrefWert des Bildelements ist besonders problematisch.

Irgendwelche Gedanken darüber, wie ich das anders machen kann, um die SVG-Datei ohne Interpretation zu lesen?

Ich habe eine Lösung gefunden, die "funktioniert", aber es ist ein Hack und ich möchte etwas eleganteres:

<xsl:template name="topic-image-svg">
    <!-- Generate tags to embed SWFs -->
    <xsl:element name="div">
      <xsl:if test="@width">
        <xsl:attribute name="width">
          <xsl:value-of select="@width"/>
        </xsl:attribute>
      </xsl:if>
      <xsl:if test="@height">
        <xsl:attribute name="height">
          <xsl:value-of select="@height"/>
        </xsl:attribute>
      </xsl:if>     
        <xsl:apply-templates select="document(@href)" mode="svg"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="*" mode="svg">
    <xsl:copy copy-namespaces="yes">
      <xsl:for-each select="@*">
        <xsl:choose>
          <xsl:when test="self::node()[name() = 'xlink:href']">
            <xsl:attribute name="xlink:href"><xsl:value-of select="."></xsl:value-of></xsl:attribute>
          </xsl:when>
          <xsl:otherwise>
            <xsl:copy></xsl:copy>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
     <xsl:apply-templates mode="svg"></xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
jrhooker
quelle
5
Verfügt Ihr Stylesheet über alle Namespaces, die im Root-Tag deklariert sind?
PhillyNJ
6
Ist der SVG-Namespace gut geformt? Das angezeigte Fragment enthält keine Bindung für das Präfix 'xlink'.
CM Sperberg-McQueen
3
Welchen XSLT 2.0-Prozessor verwenden Sie? Können Sie minimale, aber vollständige Beispiele veröffentlichen, mit denen wir das Problem reproduzieren können? Welche XSLT-Ausgabemethode verwenden Sie?
Martin Honnen
15
Auf den ersten Blick sieht es aus wie ein Fehler in Ihrem XSLT-Prozessor. Aber mein Verdacht wird geweckt, wenn Sie sagen, dass Sie es in ein HTML-Dokument kopieren. Wenn Sie es einem HTML-DOM hinzufügen, ist das HTML-DOM nicht namespace-freundlich, sodass alle möglichen Dinge passieren können. Ihr Titel lautet jedoch "xHTML". Ich denke, wir müssen mehr wissen: Welchen XSLT-Prozessor verwenden Sie und wie führen Sie ihn aus?
Michael Kay
1
Würde es Ihnen etwas ausmachen, Ihren Code und Ihre Implementierung zu teilen? Ich bin neugierig, das zumindest zu reproduzieren.
Gerard van Helden

Antworten:

1

Ich denke, Sie haben den Grund für diese XSLT-Operation gefunden:

http://www.w3schools.com/xsl/el_namespace-alias.asp

Dadurch bleiben Ihre verstümmelten Namespaces intakt, bis die Ausgabe generiert wird, wenn die Namespace-Transformation abgeschlossen ist.

Ältester Software-Typ
quelle