Lors du traitement de mon XML, j'essaie de copier un fichier SVG référencé à partir d'un href
attribut directement dans mon HTML de sortie avec la ligne suivante:
<xsl:copy-of copy-namespaces="yes" select="document(@href)"/>
Le 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 des questions quant à savoir si oui ou non je l' ai essayé.
Les fichiers sont copiés dans le HTML, mais tous les éléments d'espacement de noms sont arrosés. 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
On dirait ceci 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 noms xlink manquant sur la href
valeur de l'élément image est particulièrement problématique.
Des idées sur la façon dont je peux faire cela 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>
Réponses:
Je pense que vous avez trouvé la raison de cette opération XSLT:
ce qui laisse vos espaces de noms mutilés intacts jusqu'à ce que la sortie soit générée, lorsque la transformation de l'espace de noms est terminée.
la source