Mientras proceso mi XML, intento copiar un archivo SVG al que se hace referencia desde un href
atributo directamente en mi HTML de salida con la siguiente línea:
<xsl:copy-of copy-namespaces="yes" select="document(@href)"/>
No copy-namespaces
debería ser necesario ya que el valor predeterminado es "sí" de todos modos, pero lo agregué para evitar preguntas sobre si lo he probado o no.
Los archivos se copian en HTML, pero los elementos con espacios de nombres se almacenan. Por ejemplo, un archivo que tiene este aspecto antes de ser copiado:
<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
Se ve así despué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
El espacio de nombres xlink que falta en el href
valor del elemento de imagen es particularmente problemático.
¿Alguna idea sobre cómo puedo hacer esto de manera diferente para leer en el archivo SVG sin ninguna interpretación?
Encontré una solución que "funciona", pero es un truco y me gustaría algo más elegante:
<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>
Respuestas:
Creo que ha dado con el motivo de esta operación XSLT:
lo que deja intactos los espacios de nombres destrozados hasta que se genera la salida, cuando se realiza la transformación del espacio de nombres.
fuente