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

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

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

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ сСбС Π΄Π²Π° простых прСобразования, first.xsl ΠΈ second.xsl, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… замСняСт Π²ΠΎ входящСм Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ элСмСнты Π° Π½Π° элСмСнты b, Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅ β€” элСмСнты b Π½Π° элСмСнты с.

Листинг 10.13. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ first.xsl

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


 <xsl:template match="a">

  <b>

   <xsl:apply-templates select="@*|node()"/>

  </b>

 </xsl:template>


 <xsl:template match="@*|node()">

  <xsl:copy>

   <xsl:apply-templates select="@*|node()"/>

  </xsl:copy>

 </xsl:template>


</xsl:stylesheet>

Листинг 10.14. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ second.xsl

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


 <xsl:template match="b">

  <c>

   <xsl:apply-templates select="@*|node()"/>

  </c>

 </xsl:template>


 <xsl:template match="@*|node()">

  <xsl:copy>

   <xsl:apply-templates select="@*|node()"/>

   </xsl:copy>

  </xsl:template>


</xsl:stylesheet>

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π²Π° этих прСобразования ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ входящСму Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ a.xml, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π²Π°ΠΆΠ΄Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ процСссор:

java org.apache.xalan.xslt.Process -IN a.xml -XSL first.xsl -OUT b.xml

java org.apache.xalan.xslt.Process -IN b.xml -XSL second.xsl -OUT c.xml

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этих Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² XSLT-процСссор Xalan сначала ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ first.xsl ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ a.xml ΠΈ сохранит Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Ρ„Π°ΠΉΠ»Π΅ b.xml, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ b.xml ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ прСобразования second.xml ΠΈ сохранит Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Ρ„Π°ΠΉΠ»Π΅ c.xml.

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ‚Π΅Ρ… случаСв, ΠΊΠΎΠ³Π΄Π° пакСтная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰Π΅Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ first.xsl ΠΈ second.xsl ΠΊ входящСму Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ. Для этого:

β–‘ Π½Π°Π·Π½Π°Ρ‡ΠΈΠΌ шаблонам прСобразования first.xsl Ρ€Π΅ΠΆΠΈΠΌ first, Π° шаблонам прСобразования second.xsl β€” Ρ€Π΅ΠΆΠΈΠΌ second;

β–‘ Π² основном шаблонС ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Ρ€Π΅ΠΆΠΈΠΌΠ° first ΠΊ ΡƒΠ·Π»Π°ΠΌ входящСго Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, сохранив Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ b;

β–‘ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, содСрТащССся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ b ΠΊΠΎ мноТСству ΡƒΠ·Π»ΠΎΠ²;

β–‘ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ мноТСство ΡƒΠ·Π»ΠΎΠ² шаблонами Ρ€Π΅ΠΆΠΈΠΌΠ° second.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ листинг дСмонстрируСт ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄.

Листинг 10.5. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ first-then-second.xsl

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 xmlns:xalan="http://xml.apache.org/xalan"

 exclude-result-prefixes="xalan">


 <!-- Π¨Π°Π±Π»ΠΎΠ½Ρ‹ прСобразования first -->

 <xsl:template match="a" mode="first">

  <b>

   <xsl:apply-templates select="@*|node()" mode="first"/>

  </b>

 </xsl:template>


 <xsl:template match="@*|node()" mode="first">

  <xsl:copy>

   <xsl:apply-templates select="@*|node()" mode="first"/>

  </xsl:copy>

 </xsl:template>


 <!-- Π¨Π°Π±Π»ΠΎΠ½Ρ‹ прСобразования second -->

 <xsl:template match="@*|node()" mode="second">

  <xsl:copy>

   <xsl:apply-templates select="@*|node()" mode="second"/>

  </xsl:copy>

 </xsl:template>


 <xsl:template match="b" mode="second">

  <c>

   <xsl:apply-templates select="@*|node()" mode="second"/>

  </c>

 </xsl:template>


 <!-- ОсновноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ -->

 <xsl:template match="/">

  <!-- ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π° ΠΊΠΎΡ€Π΅Π½ΡŒ входящСго Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° -->

  <xsl:variable name="a" select="/"/>

  <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ a -->

  <xsl:comment> a: </xsl:comment>

  <xsl:copy-of select="$a"/>

  <!-- ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ b Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ a -->

  <xsl:variable name="b">

   <xsl:apply-templates select="$a" mode="first"/>

  </xsl:variable>

  <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ b -->

  <xsl:comment> b: </xsl:comment>

  <xsl:copy-of select="$b"/>

  <!-- ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ b -->

  <xsl:variable name="c">

   <xsl:apply-templates select="xalan:nodeset($b)" mode="second"/>

  </xsl:variable>

  <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ c -->

  <xsl:comment> c: </xsl:comment>

  <xsl:copy-of select="$c"/>

 </xsl:template>


</xsl:stylesheet>

Π₯ΠΎΠ΄ этого прСобразования Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Листинг 10.16. Входящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚

<Π°>

 <a>1</a>

 <a>2</a>

</Π°>

Листинг 10.17. Выходящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚

<!-- Π°: -->

<Π°>

 <a>1</a>

 <a>2</a>

</Π°>

<!-- b:-->

<b>

 <b>1</b>

 <b>2</b>

</b>

<!-- с: -->

<с>

 <c>1</c>

 <c>2</c>

</с>

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ

Π”Ρ€ΡƒΠ³ΠΎΠΉ, нСсколько Ρ€Π΅ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ, Π½ΠΎ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΌΠΎΡ‰Π½ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ XSLT ΡΠ²Π»ΡΡŽΡ‚ΡΡ элСмСнты Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… элСмСнтов, ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ прСобразования элСмСнты Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π΅ просто ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² выходящСС Π΄Π΅Ρ€Π΅Π²ΠΎ. ΠŸΡ€ΠΈ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ процСссор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ дСйствия. НапримСр, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ XSLT-процСссоры, написанныС Π½Π° Java, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ элСмСнты Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ Java-классов.

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

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ прСобразования Π² выходящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π±Ρ‹Π» сгСнСрирован β€” Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнт Π²ΠΈΠ΄Π°:

This page was generated at 10:23.

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, самым элСгантным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ этой Π·Π°Π΄Π°Ρ‡ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ использованиС элСмСнта Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π» Π±Ρ‹ Π² выходящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя. Π˜Π½Π°Ρ‡Π΅ говоря, ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ шаблона Π²ΠΈΠ΄Π°:

<xsl:template match="/">

 <!-- ... -->

 

This page was generated at <ext:time/>.

</xsl:template>

элСмСнт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ext:time Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. НиТС ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого элСмСнта для процСссора Xalan.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ программирования Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π² Xalan Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΈΠ΄Π°:

Ρ‚ΠΈΠΏ элСмСнт(org.apache.xalan.extensions.XSLProcessorContext context,

            org.apache.xalan.templates.ElemExtensionCall elem)

Π³Π΄Π΅ Ρ‚ΠΈΠΏ β€” Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, Π° элСмСнт β€” локальная Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΈ элСмСнта Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ создаСм элСмСнт с локальной Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΈΠΌΠ΅Π½ΠΈ time ΠΈ строковым Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ нашСго ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ:

public String time(XSLProcessorContext context,

                   ElemExtensionCall elem)

Π”Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ элСмСнта Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ контСкст прСобразования (XSLProcessorContext) ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° элСмСнта Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ (ElemExtensionCall). Π§ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ для создания Π±ΠΎΠ»Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ; ΠΏΠΎΠΊΠ° ΠΆΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ с элСмСнтом ext:time.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом ΠΌΡ‹ создадим класс Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ext.java, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ описанный Π²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ time.

Листинг 10.18 Класс ext.java

package de.fzi.xslt;


import java.util.Date;

import java.text.SimpleDateFormat;

import org.apache.xalan.extensions.XSLProcessorContext;

import org.apache.xalan.templates.ElemExtensionCall;


public class ext {


 public String time(XSLProcessorContext context,

  ElemExtensionCall elem) {

  SimpleDateFormat df = new SimpleDateFormat("HH:mm");

  return df.format(new Date());

 }

}

Π Π°Π²Π½ΠΎ ΠΊΠ°ΠΊ ΠΈ Π² случаС с функциями Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΡΠ²ΡΠ·ΡƒΡŽΡ‰ΠΈΠΌ Π·Π²Π΅Π½ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ элСмСнтами ΠΈ Java-ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΡ… сСмантики слуТат пространства ΠΈΠΌΠ΅Π½. Π’ нашСм случаС класс de.fzi.xslt.ext ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связан с прСфиксом пространства ΠΈΠΌΠ΅Π½ ext ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ объявлСниСм:

xmlns:ext="xalan://de.fzi.xslt.ext"

Однако это Π΅Ρ‰Π΅ Π½Π΅ всС. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ элСмСнты ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡŒ процСссором ΠΊΠ°ΠΊ элСмСнты Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊΠΆΠ΅ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ прСфиксы этих пространств Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ extension-element-prefixes элСмСнта xsl:stylesheet:

<xsl:stylesheet

 ...

 extension-element-prefixes="ext">

 ...

</xsl:stylesheet>

Π’ ΠΈΡ‚ΠΎΠ³Π΅ нашС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄.

Листинг 10.19. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ элСмСнт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ

<xsl:stylesheet