2012-10-23 52 views
1

我目前無法使用XSLT實現SVG圖像到另一個SVG圖像的成功轉換。不知何故,應用於圖像的XSLT文檔無法識別它應該將模板應用於的rect節點,至少我認爲是這樣。用XSLT轉換SVG(謝爾賓斯基地毯)

輸入XML/SVG很簡單:

<?xml version="1.0"?> 
<svg xmlns="http://www.w3.org/2000/svg"> 
    <rect x="0" y="0" width="720" height="720" fill="white"/> 
</svg> 

XSLT文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" 
encoding="UTF-8" 
indent="yes" 
doctype-system="-//W3C//DTD SVG 20000303 Stylable//EN" 
doctype-public="http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd" 
standalone="yes" /> 

<xsl:template match="/"> 
    <xsl:apply-templates select="svg/rect"/> 
</xsl:template> 

<xsl:template match="rect"> 
    <xsl:variable name="new-width" select="@width div 3"/> 
    <xsl:variable name="new-height" select="@height div 3"/> 

    <xsl:variable name="col1" select="@x"/> 
    <xsl:variable name="col2" select="@x + $new-width"/> 
    <xsl:variable name="col3" select="@x + (2 * $new-width)"/> 

    <xsl:variable name="row1" select="@y"/> 
    <xsl:variable name="row2" select="@y + $new-height"/> 
    <xsl:variable name="row3" select="@y + (2 * $new-height)"/> 

    <rect x="$col1" y="$row1" width="$new-width" height="$new-height" fill="white"/> 
    <rect x="$col2" y="$row1" width="$new-width" height="$new-height" fill="white"/> 
    <rect x="$col3" y="$row1" width="$new-width" height="$new-height" fill="white"/> 

    <rect x="$col1" y="$row2" width="$new-width" height="$new-height" fill="white"/> 
    <rect x="$col2" y="$row2" width="$new-width" height="$new-height" fill="black"/> 
    <rect x="$col3" y="$row2" width="$new-width" height="$new-height" fill="white"/> 

    <rect x="$col1" y="$row3" width="$new-width" height="$new-height" fill="white"/> 
    <rect x="$col2" y="$row3" width="$new-width" height="$new-height" fill="white"/> 
    <rect x="$col3" y="$row3" width="$new-width" height="$new-height" fill="white"/> 
</xsl:template> 

</xsl:stylesheet> 

我已經消除了我可能已經想到的錯誤的所有來源:

  • 行內數學( - >變量)
  • apply-templates中的錯誤節點選擇
  • 錯誤的輸出方法

我甚至使用for-each循環適用不適用模板此模板嘗試過,但也沒有成功。現在我不知道我能再試一次,於是問你。

+0

的東西,總之,不使用引擎收錄。我已更新你的帖子。 –

回答

3

XML文件將內容放置在名稱空間中,而您的XSLT沒有聲明該名稱空間。

  1. xmlns:svg="http://www.w3.org/2000/svg"添加到您的樣式表中。
  2. 變化<xsl:apply-templates select="svg:svg/svg:rect"/>
  3. 變化<xsl:template match="svg:rect">
+1

感謝您的回答!我嘗試在xsl:stylesheet-node中添加'xmlns =「http://www.w3.org/2000/svg」',但它仍然沒有結果。改爲添加'xmlns:svg =「http://www.w3.org/2000/svg」',並且使用_svg_加上模板中的所有rect節點也不起作用。 –

+0

我使用Oxygen/XML進行了測試並更新了我的答案。這對我有用。 –

+0

好吧,也適合我。感謝您的幫助。在旁註中,所有其他svg元素(如模板中的矩形)也需要具有前面的「svg:」。 –