Я думаю, вы неправильно понимаете, как работает XSLT. Он принимает входное дерево XML и создает дерево new , интерпретируя вашу таблицу стилей. Другими словами, ваша таблица стилей определяет, как создается абсолютно новое дерево с нуля на основе входного дерева 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>