<точка 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(α),

где x' и y' — старые координаты точки, x и y — новые координаты точки, а α — угол поворота. Единственная загвоздка состоит в том, что функций sin и cos в базовой библиотеке XPath нет.

Самым простым выходом в такой ситуации является использование расширений. Например, в случае XSLT-процессора, который может использовать Java-расширения (Saxon, Xalan, Oracle XSLT Processor и так далее) надо будет лишь только объявить пространство имен вида:

xmlns:math='java:java.lang.Math'

и использовать функции math:sin и math:cos.

Листинг 10.6. Преобразование, осуществляющее поворот

<?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'/>

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату