主要的問題似乎是SVG片段進入SVG命名空間。你可以使用XSLT來「完成」的SVG(加上週邊SVG元素),並把一切都在正確的命名空間:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/2000/svg" version="1.0">
<!-- The dimension can be supplied using a parameter.
This defaults to 100%. -->
<xsl:param name="width" select="'100%'"/>
<xsl:param name="height" select="'100%'"/>
<xsl:template match="/">
<svg version="1.1" width="{$width}" height="{$height}">
<xsl:apply-templates/>
</svg>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="http://www.w3.org/2000/svg">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|text()">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
你必須加載使用AJAX
樣式表和您的SVG片段使用Ajax來獲取SVG片段,如:
var loadXML = function(fileName,mime) {
xmlHttpRequest = new XMLHttpRequest()
xmlHttpRequest.open("GET",fileName,false);
xmlHttpRequest.send("");
return xmlHttpRequest.responseXML;
}
var svgSnippet = loadXML(snippetURL,"image/svg+xml")
var xslt = loadXML(xsltURL,"application/xslt+xml")
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslt);
// You can override the default width/height parameters here
xsltProcessor.setParameter(null,"width","150px")
xsltProcessor.setParameter(null,"width","90px")
// In the document there must be some element to append the SVG
documentGetElementById("svgContainer").appendChild(xsltProcessor.transformToFragment(svgSnippet,document).firstChild)
這是所有未經測試,但也許事情從開始。如果你還需要XLink命名空間,這當然是不完整的。
這當然是一個很好的解決方案,顯然它解決了我看到的命名空間問題! –
嗯,我正在使用Chrome版本進行測試。 23,並且當broswer試圖執行xmlHTTP.send()時,我得到「只支持HTTP的交叉源請求」。在函數fixSVG()中,可能是如果我建立一個服務器,這將被解決......但是有沒有一個完全基於客戶端的解決方案? – StaticBug
是的,Chrome不想用file:protocol做XHR,我看到了同樣的問題,一旦我運行服務器並使用localhost,問題就沒有了。 Firefox並不是那麼挑剔......我不明白「完全基於客戶端的」問題,它已經全部是「基於客戶端的」,即。它不涉及服務器端腳本,只使用服務器來...提供文件。 – PhiLho