Saat memproses XML saya, saya mencoba menyalin file SVG yang direferensikan dari href
atribut langsung ke HTML keluaran saya dengan baris berikut:
<xsl:copy-of copy-namespaces="yes" select="document(@href)"/>
The copy-namespaces
seharusnya tidak diperlukan karena nilai default adalah "ya" saja, tapi aku sudah menambahkan untuk mencegah pertanyaan tentang apakah atau tidak saya sudah mencobanya.
File-file tersebut disalin ke dalam HTML, tetapi setiap elemen dengan namespace disemprot. Misalnya, file yang terlihat seperti ini sebelum disalin:
<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
Tampak seperti ini setelahnya:
<_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
Namespace xlink yang hilang pada href
nilai elemen gambar sangat bermasalah.
Adakah pemikiran tentang bagaimana saya dapat melakukan ini secara berbeda untuk membaca di file SVG tanpa interpretasi apa pun?
Saya telah menemukan satu solusi yang "berhasil", tetapi ini adalah retasan dan saya ingin solusi yang lebih elegan:
<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>
Jawaban:
Saya pikir Anda telah menemukan alasan operasi XSLT ini:
yang membiarkan namespace Anda yang rusak tetap utuh hingga keluaran dihasilkan, saat transformasi namespace selesai.
sumber