Атрибуты округления XSLT для оптимизации SVG - PullRequest
1 голос
/ 23 февраля 2011

Мне нужно уменьшить числовую точность и минимальный показатель SVG-атрибутов для экономии места.

Введите:

<svg xmlns="http://www.w3.org/2000/svg" width="250" height="250">
 <circle cx="125.1111" cy="125.2222" r="124.9999" fill="red"/>
</svg>

Выход:

<svg xmlns="http://www.w3.org/2000/svg" width="250" height="250">
 <circle cx="125.1" cy="125.2" r="125.0" fill="red"/>
</svg>

Какая таблица стилей даст результат?
Есть мысли о безопасности этого?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@*[.=number()]">
        <xsl:attribute name="{name()}">
            <xsl:value-of select="format-number(.,'#.#')"/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Выход:

<svg width="250" height="250" xmlns="http://www.w3.org/2000/svg">
    <circle cx="125.1" cy="125.2" r="125" fill="red"></circle>
</svg>
0 голосов
/ 23 февраля 2011

О применимости:

Без надлежащего анализа это не сработает во всех случаях, но обычно работает нормально, чтобы отрубить несколько десятичных знаков и надеяться на лучшее. Усечение до одного десятичного знака в градиентах (обычно определяемых в пространстве objectBoundingBox) может дать плохие результаты, также как и в других местах, использующих единицы objectBoundingBox (такие значения атрибутов обычно находятся в диапазоне [0..1]). Все остальное в основном зависит от текущего преобразования (CTM) и от того, какой viewBox используется в корневом элементе svg.

...