Добавить атрибут в тег с помощью XSLT - PullRequest
4 голосов
/ 03 марта 2012

У меня есть несколько svg документов с 1-n элементами Path. Теперь я хотел изменить цвет этих элементов path.

Я не нашел способа сделать это

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>

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

1 Ответ

4 голосов
/ 03 марта 2012

Я думаю, вы неправильно понимаете, как работает 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...