Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ВСхнология XSLTΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 97

Автор АлСксСй Π’Π°Π»ΠΈΠΊΠΎΠ²

β–‘ Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ языка для написания Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ зависит ΠΎΡ‚ наличия интСрфСйса XSLT-процСссора для этого языка. НС слСдуСт ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ любой процСссор смоТСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ, написанными Π½Π° любом языкС, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΈΠ½Π°Ρ‡Π΅ говоря, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ прСобразования ΠΊ строго ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ процСссору ΠΈΠ»ΠΈ, Π² Π»ΡƒΡ‡ΡˆΠ΅ΠΌ случаС, Π³Ρ€ΡƒΠΏΠΏΠ΅ процСссоров.

β–‘ Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ сам XSLT Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ сторонних эффСктов, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ обязаны. ВслСдствиС этого прСобразования, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ с ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·-Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ входящСго Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… процСссорах Ρ€Π°Π·Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π˜Ρ‚Π°ΠΊ, вопрос, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ β€” это вопрос "Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΈΠ² пСрСносимости", ΠΈ, хотя Π΅Π³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ всСгда Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ довольно ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ ΠΎΡ†Π΅Π½ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ (Ρ‚Π°Π±Π». 10.1).


Π’Π°Π±Π»ΠΈΡ†Π° 10.1. ИспользованиС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ: ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ Π·Π° ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ стоит, Ссли: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π΅ стоит, Ссли: прСобразования Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° Π·Π°Ρ€Π°Π½Π΅Π΅ извСстном процСссорС ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ΅ процСссоров; Ρ†Π΅Π»Π΅Π²ΠΎΠΉ процСссор нСизвСстСн. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ пСрСносимы, насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ; Π² XSLT Π½Π΅Ρ‚ срСдств для выполнСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, Π»ΠΈΠ±ΠΎ ΠΎΠ½ΠΈ ΠΎΡ‡Π΅Π½ΡŒ нСэффСктивны; Π² XSLT ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ срСдства для выполнСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ; ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами; ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов; Ρ†Π΅Π»Π΅Π²ΠΎΠΉ процСссор прСдоставляСт интСрфСйс для Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстного Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ языка программирования интСрфСйс для Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ языка программирования Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΌ процСссорС отсутствуСт

Подводя ΠΈΡ‚ΠΎΠ³, ΠΎΠ±Ρ€Π°Π·Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ°ΡΡΡŒ, скаТСм, Ρ‡Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ β€” это ΠΏΡƒΡˆΠΊΠ°, ΡΡ‚Ρ€Π΅Π»ΡΡ‚ΡŒ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎ Π²ΠΎΡ€ΠΎΠ±ΡŒΡΠΌ рСкомСндуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ остаСтся Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, ΠΈΠ»ΠΈ Π²ΠΎΡ€ΠΎΠ±ΡŒΠΈ достаточно Π²Π΅Π»ΠΈΠΊΠΈ.

К соТалСнию, Π½Π΅ прСдставляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ интСрфСйсы Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π΄Π°ΠΆΠ΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных XSLT-процСссоров. ВмСсто этого ΠΌΡ‹ постараСмся ΠΈΠ·Π»ΠΎΠΆΠΈΡ‚ΡŒ основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ создания Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ нСсколько ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ смогут ΠΏΠΎΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ основой для создания частных Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ языком Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π² этой Π³Π»Π°Π²Π΅, Π±ΡƒΠ΄Π΅Ρ‚ Java. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, Java являСтся СдинствСнным языком, интСрфСйсы Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ достаточно стандартизированы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°Ρ…. Однако, Ссли Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌ с этим языком β€” Π½ΠΈΡ‡Π΅Π³ΠΎ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ³ΠΎ, вСдь основноС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π² этой Π³Π»Π°Π²Π΅ удСляСтся использованию Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π² XSLT, Π° Π½Π΅ написанию ΠΈΡ… Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках ΠΈ Java-ΠΊΠΎΠ΄ приводится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, вспомним, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ Π² прСобразованиях ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ concat:

<xsl:value-of select="concat('para', 'bellum')"/>

Атрибут select содСрТит XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ concat('para', 'bellum'), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния синтаксиса XPath являСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ соотвСтствуСт ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ FunctionCall:

[XP16] FunctionCall ::= FunctionName

                        '(' ( Argument ( ',' Argument ) * ) ? ')'

АргумСнтами Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ выраТСния, Π° имя ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ XML-ΠΈΠΌΠ΅Π½Π΅ΠΌ (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ node, comment, processing-instruction ΠΈ text, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠ° ΡƒΠ·Π»Π°):

[XP17] Argument     ::= Expr

[XP35] FunctionName ::= QName - NodeType

Π’ ΠΏΠ»Π°Π½Π΅ синтаксиса Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ стандартных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: ΠΎΠ½ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Ρ‚Π΅ΠΌ ΠΆΠ΅ самым грамматичСским ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ. ЕдинствСнноС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ XPath ΠΈ XSLT ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΌΡƒ пространству ΠΈΠΌΠ΅Π½, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ пространство ΠΈΠΌΠ΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ. Π˜Π½Ρ‹ΠΌΠΈ словами, Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π²ΠΈΠ΄ имя(Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ...), Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π° Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΈΠ΄Π° прСфикс:имя(Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ...) Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

round(0.6)

являСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ XPath, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

math:round(0.6)

являСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ Π²ΠΎ всСх процСссорах пространство ΠΈΠΌΠ΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ являСтся Π·Π²Π΅Π½ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ связываСт Π΅Π΅ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

<xsl:value-of select="math:round(0.6)" xmlns:math="java:java.lang.Math"/>

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ xsl:value-of вычисляСт Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ math:round(0.6), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Π‘Π°ΠΌΠΎ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ состоит ΠΈΠ· локальной части round ΠΈ прСфикса math, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ соотвСтствуСт URI java:java.lang.Math. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ XSLT-процСссоров Π²Ρ‹Π·ΠΎΠ² Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ статичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ round класса java.lang.Math.

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ случаСм использования Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π² XSLT-процСссорах, написанных Π½Π° Java, являСтся ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ стандартным функциям ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Java.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ входящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ описываСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ мноТСства Ρ‚ΠΎΡ‡Π΅ΠΊ, Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ создаСт SVG-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, содСрТащий Π»ΠΈΠ½ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

SVG β€” это XML-язык для описания ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ (ΠΎΡ‚ Π°Π½Π³Π». scalable vector graphics). SVG позволяСт простым XML-синтаксисом ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΡƒΡŽ Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ. SVG-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ‚Π°ΠΊΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠ°ΠΊ Adobe SVG Viewer ΠΈΠ»ΠΈ Batik ΠΎΡ‚ Apache XML Project.

Листинг 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(Ξ±),