2012-03-03 4 views
3

У меня есть несколько документов svg с элементами 1-n Path, теперь я хочу изменить цвет этих элементов пути.Добавить атрибут для тега с помощью 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> 

Что мне нужно изменить, чтобы сделать его добавить/изменить атрибут fill на красный?

ответ

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

Смежные вопросы