Während der Verarbeitung meines XML versuche ich, eine SVG-Datei, auf die von einem href
Attribut verwiesen wird, mit der folgenden Zeile direkt in mein Ausgabe-HTML zu kopieren :
<xsl:copy-of copy-namespaces="yes" select="document(@href)"/>
Das copy-namespaces
sollte 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 href
Wert 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>
Antworten:
Ich denke, Sie haben den Grund für diese XSLT-Operation gefunden:
Dadurch bleiben Ihre verstümmelten Namespaces intakt, bis die Ausgabe generiert wird, wenn die Namespace-Transformation abgeschlossen ist.
quelle