<точка x='-50' y='-50'/>
<точка x=' 50' y='-50'/>
<точка x=' 50' y=' 50'/>
<точка x='-50' y=' 50'/>
</точки>
<?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-документ.
<!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-документа
Предположим теперь, что нам нужно не просто создать по данному множеству точек набор соединяющих их линий, но еще и произвести некоторые геометрические преобразования, например поворот на заданный в градусах угол α.
Формулы преобразования координат при повороте чрезвычайно просты:
где sin
и cos
в базовой библиотеке XPath нет.
Самым простым выходом в такой ситуации является использование расширений. Например, в случае XSLT-процессора, который может использовать Java-расширения (Saxon, Xalan, Oracle XSLT Processor и так далее) надо будет лишь только объявить пространство имен вида:
xmlns:math='java:java.lang.Math'
и использовать функции math:sin
и math:cos
.
<?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'
xmlns:math='java:java.lang.Math'>
<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'/>