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

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

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

Ρƒ = 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"/>


 <xsl:param name="alpha" select="30"/>

 <xsl:variable name="alpha-radian" select="3.14 * ($alpha div 180)"/>


 <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="Ρ‚ΠΎΡ‡ΠΊΠ°">

  <xsl:variable name="x1" select="@x"/>

  <xsl:variable name="y1" select="@y"/>

  <xsl:variable name="x2r">

   <xsl:choose>

    <xsl:when test="position() = last()">

     <xsl:value-of select="preceding-sibling::Ρ‚ΠΎΡ‡ΠΊΠ°[last()]/@x"/>

    </xsl:when>

    <xsl:otherwise>

     <xsl:value-of select="following-sibling::Ρ‚ΠΎΡ‡ΠΊΠ°[1]/@x"/>

    </xsl:otherwise>

   </xsl:choose>

  </xsl:variable>

  <xsl:variable name="y2r">

   <xsl:choose>

    <xsl:when test="position() = last()">

     <xsl:value-of select="preceding-sibling::Ρ‚ΠΎΡ‡ΠΊΠ°[last()]/@y"/>

    </xsl:when>

    <xsl:otherwise>

     <xsl:value-of select="following-sibling::Ρ‚ΠΎΡ‡ΠΊΠ°[1]/@y"/>

    </xsl:otherwise>

   </xsl:choose>

  </xsl:variable>


  <xsl:variable name="x2" select="number($x2r)"/>

  <xsl:variable name="y2" select="number($y2r)"/>


  <line

   x1="{$x1 * math:cos($alpha-radian) -

        $y1 * math:sin($alpha-radian) + 100}"

   y1="{$x1 * math:sin($alpha-radian) +

        $y1 * math:cos($alpha-radian) + 100}"

   x2="{$x2 * math:cos($alpha-radian) -

        $y2 * math:sin($alpha-radian) + 100}"

   y2="{$x2 * math:sin($alpha-radian) +

        $y2 * math:cos($alpha-radian) + 100}"/>

 </xsl:template>


</xsl:stylesheet>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ этого прСобразования Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚.

Листинг 10.7. Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ 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"

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

 width="200"

 height="200">

 <desc>Simple line-based figure</desc>

  <g style="stroke:black; stroke-width:2">

  <line

   x1="81.68060041188197" y1="31.70359014757173"

   x2="168.29640985242827" y2="81.68060041188197"/>

  <line

   x1="168.29640985242827" y1="81.68060041188197"

   x2="118.31939958811803" y2="168.29640985242827"/>

  <line

   x1="118.31939958811803" y1="168.29640985242827"

   x2="31.70359014757173" y2="118.31939958811803"/>

  <line

   x1="31.70359014757173" y1="118.31939958811803"

   x2="81.68060041188197" y2="31.70359014757173"/>

 </g>

</svg>

Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ прСдставлСниС этого Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° дСмонстрируСт рис. 10.2, Π³Π΄Π΅ прСдставлСн ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ Π½Π° 30Β°:

Рис. 10.2. Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ прСдставлСниС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ SVG-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

Анализируя ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ объявлСниС пространства ΠΈΠΌΠ΅Π½ с прСфиксом math, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π² Π½Π΅Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ:

<svg

 xmlns="http://www.w3.org/2000/svg"

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

 width="200"

 height="200">

 ...

Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‚ самый случай, ΠΊΠΎΠ³Π΄Π° объявлСниС пространства ΠΈΠΌΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² самом ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ, Π½ΠΎ являСтся лишним Π² выходящСм Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅Π³ΠΎ, Π½ΡƒΠΆΠ½ΠΎ просто Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ прСфикс math Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ exclude-result-prefixes элСмСнта xsl:stylesheet.

<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"

 exclude-result-prefixes="math">

 ...

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

Листинг 10.8. Класс, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ послС ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°

package de.fzi.xslt;


public class rot {

 public static double X(double x, double y, double degree) {

  double radian = Math.PI * degree / 180;

  return x * Math.cos(radian) - y * Math.sin(radian);

 }


 public static double Y(double x, double y, double degree) {

  double radian = Math.PI * degree / 180;

  return x * Math.sin(radian) + y * Math.cos(radian);

 }

}

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ этого класса Π² качСствС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ объявлСния Π² элСмСнтС xsl:stylesheet:

<xsl:stylesheet

 version="1.0"

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

 xmlns="http://www.w3.org/2000/svg"

 xmlns:rot="java:de.fzi.xslt.rot"

 exclude-result-prefixes="rot">

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ элСмСнта line Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записано Π² Π²ΠΈΠ΄Π΅:

<line

 x1="{rot:X($x1, $y1, $alpha) + 100}"

 y1="{rot:Y($x1, $y1, $alpha) + 100}"

 x2="{rot:X($x2, $y2, $alpha) + 100}"

 y2="{rot:Y($x2, $y2, $alpha) + 100}"/>

Как ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ Π²Ρ‹ΡˆΠ΅, интСрфСйсы использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ вСсьма Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ процСссорами Π΄Π°ΠΆΠ΅ Π² случаС Ρ‚Π°ΠΊΠΎΠ³ΠΎ пСрСносимого языка, ΠΊΠ°ΠΊ Java. ΠžΡ‚Π»ΠΈΡ‡ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ΅ объявлСний пространств ΠΈΠΌΠ΅Π½. НапримСр, Π² процСссорС Saxon пространство ΠΈΠΌΠ΅Π½ для класса de.fzi.xslt.rot ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ объявлСно ΠΊΠ°ΠΊ:

xmlns:rot="java:de.fzi.xslt.rot"

Π² Xalan β€” ΠΊΠ°ΠΊ:

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

Π² Oracle XSLT Processor β€” ΠΊΠ°ΠΊ:

xmlns:rot="http://www.oracle.com/XSL/Transform/java/de.fzi.xslt.rot"

ΠŸΡ€ΠΈ этом сами Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΎ всСх Ρ‚Ρ€Π΅Ρ… случаях Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ:

rot:X($x, $y, $angle)

для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° X ΠΈΠ»ΠΈ

rot:Y($x, $y, $angle)

для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Y.

Ѐункция function-available

ΠŸΡ€ΠΈ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ всСгда Π΅ΡΡ‚ΡŒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ это Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π² силу ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌ процСссором Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π§Π°Ρ‰Π΅ всСго это случаСтся, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΊΠΎΠ³Π΄Π° процСссор просто физичСски Π½Π΅ Π² состоянии Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, процСссор, написанный Π½Π° C++, вряд Π»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ срСдства для выполнСния Java-ΠΊΠΎΠ΄Π°), Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠΎΠ³Π΄Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ нСдоступно (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, процСссор Π½Π΅ Π² состоянии Π½Π°ΠΉΡ‚ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Java-класс ΠΈΠ»ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ), ΠΈ Π²-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, ΠΊΠΎΠ³Π΄Π° пространство ΠΈΠΌΠ΅Π½ объявлСно Π½Π΅Π²Π΅Ρ€Π½ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с URI java:de.fzi.xslt.rot вмСсто xalan://de.fzi.xslt.rot). Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ обращСния ΠΊ Π½Π΅ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΌΡƒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚, СстСствСнно, ошибка.

XSLT позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ошибок ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Для этой Ρ†Π΅Π»ΠΈ слуТит стандартная функция function-available (ΠΎΡ‚ Π°Π½Π³Π». function is available β€” функция доступна)

boolean function-available(string)

Ѐункция function-available ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ строку, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли эта функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° ΠΈ false β€” Ссли Π½Π΅Ρ‚.

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСдставляСт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ QName, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄ имя ΠΈΠ»ΠΈ прСфикс:имя. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС function-available провСряСт, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π»ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ процСссорС стандартная функция с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ function-available('concat') скорСС всСго, Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ true.

Π’ случаС, Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ function-available ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ прСфикс:имя, функция function-available провСряСт Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. НапримСр, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ контСкстС Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° функция rot:X, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

function-available('rot:X')