2012-03-03 64 views
3

我有幾個帶有1-n Path元素的svg文檔,現在我想更改這些路徑元素的顏色。使用XSLT將屬性添加到標記

我還沒有找到一個辦法做到這一點

Svg爲示例文檔:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="45" width="45" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> 
<g transform="matrix(1.25,0,0,-1.25,0,45)"> 
<path d="m9 18h18v-3h-18v3"/> 
</g> 
</svg> 

XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' version='1.0'> 
<xsl:template match='path'> 
<xsl:copy> 
<xsl:attribute name='fill'>red</xsl:attribute> 
</xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

我需要做什麼改變,使其添加/將填充屬性更改爲紅色?

回答

3

我想你誤解了XSLT是如何工作的。它需要一個輸入XML樹,並通過解釋你的樣式表來生成一個新的樹。換句話說,您的樣式表定義瞭如何根據輸入XML樹從頭開始生成全新的樹。

瞭解您不修改原始XML樹很重要。這就像純粹功能性和命令性語言之間的區別。底線:您不能更改fill屬性爲red,您可以生成fill屬性設置爲red的原始文檔的副本。

這就是說,這是多還是少,你會怎麼做:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:svg="http://www.w3.org/2000/svg" version='1.0'> 
    <!-- this template is applied by default to all nodes and attributes --> 
    <xsl:template match="@*|node()"> 
     <!-- just copy all my attributes and child nodes, except if there's a better template for some of them --> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- this template is applied to an existing fill attribute --> 
    <xsl:template match="svg:path/@fill"> 
     <!-- produce a fill attribute with content "red" --> 
     <xsl:attribute name="fill">red</xsl:attribute> 
    </xsl:template> 

    <!-- this template is applied to a path node that doesn't have a fill attribute --> 
    <xsl:template match="svg:path[not(@fill)]"> 
     <!-- copy me and my attributes and my subnodes, applying templates as necessary, and add a fill attribute set to red --> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
      <xsl:attribute name="fill">red</xsl:attribute> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

感謝那些工作完美無瑕! – Peter 2012-03-03 18:03:06

相關問題