Lors du traitement de mon XML, j'essaie de copier un fichier SVG référencé à partir d'un fichier d'archive. href
directement dans mon HTML de sortie avec la ligne suivante :
<xsl:copy-of copy-namespaces="yes" select="document(@href)"/>
Le site copy-namespaces
ne devrait pas être nécessaire puisque la valeur par défaut est "oui" de toute façon, mais je l'ai ajouté pour éviter les questions sur le fait que je l'ai essayé ou non.
Les fichiers sont copiés dans le HTML, mais tous les éléments à espacement de noms sont détruits. Par exemple, un fichier qui ressemble à ceci avant d'être copié :
<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
Ça ressemble à ça après :
<_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
L'espace de nom xlink manquant sur le href
de l'élément image est particulièrement problématique.
Avez-vous une idée de la manière dont je peux procéder différemment pour lire le fichier SVG sans aucune interprétation ?
J'ai trouvé une solution qui "fonctionne", mais c'est un hack et j'aimerais quelque chose de plus élégant :
<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>