Trong khi xử lý XML của mình, tôi đang cố gắng sao chép href
trực tiếp tệp SVG được tham chiếu từ một thuộc tính vào HTML đầu ra của mình với dòng sau:
<xsl:copy-of copy-namespaces="yes" select="document(@href)"/>
Điều copy-namespaces
này không cần thiết vì dù sao giá trị mặc định là "có", nhưng tôi đã thêm nó để ngăn câu hỏi về việc tôi đã thử hay chưa.
Các tệp được sao chép vào HTML, nhưng bất kỳ phần tử nào có không gian tên đều bị xóa. Ví dụ: một tệp trông giống như thế này trước khi được sao chép:
<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
Sau đó trông như thế này:
<_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
Không gian tên xlink bị thiếu trên href
giá trị của phần tử hình ảnh đặc biệt có vấn đề.
Bất kỳ suy nghĩ nào về cách tôi có thể làm điều này theo cách khác để đọc trong tệp SVG mà không cần bất kỳ giải thích nào?
Tôi đã tìm thấy một giải pháp "hoạt động", nhưng đó là một cuộc tấn công và tôi muốn một cái gì đó thanh lịch hơn:
<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>