Валиков Алексей Н.
Шрифт:
Листинг 10.3. Входящий документ
<?xml version="1.0" encoding="windows-1251"?>
<точки width="200" height="200">
<точка x="-50" y="-50"/>
<точка x=" 50" y="-50"/>
<точка x=" 50" y=" 50"/>
<точка x="-50" y=" 50"/>
</точки>
Листинг 10.4. Преобразование
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/2000/svg">
<xsl:output
indent="yes"
doctype-public="-//W3C//DTD SVG 1.0//EN"
doctype-system="http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"/>
<xsl:template match="/">
<svg width="200" height="200">
<desc>Simple line-based figure</desc>
<xsl:apply-templates select="точки"/>
</svg>
</xsl:template>
<xsl:template match="точки">
<g style="stroke:black; stroke-width:2">
<xsl:apply-templates select="точка"/>
</g>
</xsl:template>
<xsl:template match="точка">
<line
x1="{@x + 100}"
y1="{@y + 100}"
x2="{following-sibling::точка[1]/@x + 100}"
y2="{following-sibling::точка[1]/@y + 100}">
<xsl:if test="position = last">
<xsl:attribute name="x2">
<xsl:value-of
select="preceding-sibling::точка[last]/@x + 100"/>
</xsl:attribute>
<xsl:attribute name="y2">
<xsl:value-of
select="preceding-sibling::точка[last]/@y + 100"/>
</xsl:attribute>
</xsl:if>
</line>
</xsl:template>
</xsl:stylesheet>
Результатом этого преобразования является следующий SVG-документ.
Листинг 10.5. Выходящий SVG-документ
<!DOCTYPE svg
PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
<desc>Simple line-based figure</desc>
<g style="stroke:black; stroke-width:2">
<line x1="50" y1="50" x2="150" y2="50"/>
<line x1="150" y1="50" x2="150" y2="150"/>
<line x1="150" y1="150" x2="50" y2="150"/>
<line x1="50" y1="150" x2="50" y2="50"/>
</g>
</svg>
На рис. 10.1 приведен пример визуального представления этого документа.
Рис. 10.1. Визуальное представление полученного SVG-документа
Предположим теперь, что нам нужно не просто создать по данному множеству точек набор соединяющих их линий, но еще и произвести некоторые геометрические преобразования, например поворот на заданный в градусах угол α.
Формулы преобразования координат при повороте чрезвычайно просты:
x = x'∙cos(α) − y∙sin(α),
у = x'∙sin(α) + x'∙cos(α),