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

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

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

  </a>

  <br/><xsl:text>&#xA;</xsl:text>

  <!--

   | Если катСгория ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ раскрываСмой Π²Π΅Ρ‚ΠΊΠ΅,

   | ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π΅Π΅ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ

   +-->

  <xsl:if test="count(.|$path)=count($path)">

   <xsl:apply-templates select="category">

    <!-- Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ отступ Π½Π° Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Π° -->

    <xsl:with-param name="indent"

     select="concat($indent,'&#xA0;&#xA0;&#xA0;')"/>

   </xsl:apply-templates>

  </xsl:if>

 </xsl:template>


</xsl:stylesheet>

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ лишь Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ страницу, которая ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ JavaScript ΠΈ MSXML Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ прСобразования ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ возмоТностями MSXML, ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π² Π½Π°ΡˆΡƒ страницу Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

<!-- ΠžΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ входящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ -->

<object

 id="source"

 width="0"

 height="0"

 classid="clsid:f5078f32-c551-11d3-89b9-0000f81fe221">

 <param name="async" value="false">

 <param name="validateOnParse" value="false">

</object>

<!-- ΠžΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ прСобразования -->

<object

 id="stylesheet"

 width="0"

 height="0"

 classid="clsid:f5078f32-c551-11d3-89b9-0000f81fe221">

 <param name="async" value="false">

 <param name="validateOnParse" value="false">

</object>

"ΠœΠ°Π³ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ" ΠΊΠΎΠ΄ clsid:f5078f32-c551-11d3-89b9-0000f81fe221, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ присутствуСт Π² Ρ‚Π΅Π³Π°Ρ… ΠΎΠ±ΠΎΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ MSXML 3.0, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для выполнСния прСобразования. Π˜Ρ‚Π°ΠΊ, ΠΊΠΎΠ΄ нашСй HTML- страницы Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Листинг 9.8. Код HTML-страницы

<html>

 <head>

  <meta

   http-equiv="Content-Type"

   content="text/html; charset=windows-1251" />

  <style type="text/css">

   body {font-family:Tahoma,Verdana,Arial,sans-serif; font-size:14px}

   a:link {COLOR:#990000; BACKGROUND: #ffffff; TEXT-DECORATION: none}

   a:hover {BACKGROUND: #dddddd; TEXT-DECORATION: none}

   a:visited {COLOR: #990000; TEXT-DECORATION: none}

  </style>

  <script language="JavaScript">

   <!--

   // ОбъявляСм Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

   // Входящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚

   var source;

   // ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅

   var stylesheet;

   // Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

   var result;


   // Ѐункция, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ дСйствия ΠΏΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

   function init() {

    // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ входящСго Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

    source = document.all['source'];

    // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ входящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚

    source.load('source.xml');

    // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прСобразования

    stylesheet = document.all['stylesheet'];

    // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ прСобразования

    stylesheet.load('stylesheet.xsl');

    // Находим элСмСнт, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ

    // Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

    result = document.all['result'];

   }


   // Ѐункция, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ "раскрытиС"

   //ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ Π΄Π΅Ρ€Π΅Π²Π° ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ.

   function expand(id) {

    // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ссылку Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ select

    // объявлСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° current

    var attSelect = stylesheet.selectSingleNode(

     "/xsl:stylesheet/xsl:param[@name='current']/@select");

    // ИзмСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°. ΠžΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹

    // для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»ΠΎΡΡŒ ΠΊΠ°ΠΊ Π»ΠΈΡ‚Π΅Ρ€Π°Π».

    attSelect.nodeValue = "'" + id + "'";

    // ВыполняСм ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅

    strResult = source.transformNode(stylesheet);

    // ОбновляСм страницу

    result.innerHTML = strResult;

   }

   //-->

  </script>

 </head>

 <body onload="init()">

  <!-- ΠžΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ входящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ -->

  <object

   id="source"

   width="0"

   height="0"

   classid="clsid:f5078f32-c551-11d3-89b9-0000f81fe221">

   <param name="async" value="false">

   <param name="validateOnParse" value="false">

  </object>

  <!-- ΠžΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ прСобразования -->

  <object

   id="stylesheet"

   width="0"

   height="0"

   classid="clsid:f5078f32-c551-11d3-89b9-0000f81fe221">

   <param name="async" value="false">

   <param name="validateOnParse" value="false">

  </object>

  <a href="javascript:expand(' ')">ΠšΠ°Ρ‚Π°Π»ΠΎΠ³</Π°>

  <!-- Π’ этом элСмСнтС ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ -->

  <div id="result"/>

 </body>

</html>

Π’ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ эта страница Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (рис. 9.10).

Рис. 9.10. ДинамичСский ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π° HTML с использованиСм JavaScript, MSXML Π½Π° основС XML ΠΈ XSLT

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ XSLT-ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Π² VBScript/ASP

ИспользованиС MSXML Π½Π° сторонС сСрвСра Π½Π΅ сильно отличаСтся ΠΎΡ‚ клиСнтской вСрсии, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ Π²Ρ‹ΡˆΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ MSXML являСтся стандартным БОМ-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² любом языкС программирования, ΡƒΠΌΠ΅ΡŽΡ‰Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с COM. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ MSXML Π² ASP-страницС, написанной Π½Π° языкС VBScript. ΠœΡ‹ напишСм нСбольшоС Web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ сообщСния (SMS) Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°Π·Π½Ρ‹Π΅ слуТбы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ΄ΠΈΠ½ интСрфСйс.

ΠŸΠΎΡ‡Ρ‚ΠΈ Ρƒ всСх ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² мобильной связи Ρ„ΠΎΡ€ΠΌΡ‹ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ стандартны, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

<form action=" http://www.bmtelecom.ru/wap/xm.php?snd=1 " method="POST">

 <input type="hidden" name="num" value="Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°">

 <textarea rows="10" cols="50" name="msg">тСкст сообщСния</textarea>

 <br><br>

 <input class="flat" type="submit" value="ΠŸΠΎΡΠ»Π°Ρ‚ΡŒ сообщСниС">

</form>

ΠŸΡ€ΠΈ этом Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠ³ΡƒΡ‚ адрСса слуТб ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Ρ„ΠΎΡ€ΠΌ ΠΈ наимСнования ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π°. ВсС это ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅.

Листинг 9.9. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ слуТб ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний β€” services.xml

<services>

 <service id="MTNSMS">

  <action>http://www.mtnsms.com/sendsms.php</action>

  <method>GET</method>

  <text>msg</text>

  <number>num</number>

 </service>


 <service id="SMSHost">

  <action>http://www.smshost.net/servlets/sms</action>

  <method>POST</method>

  <text>message</text>

  <number>phone</number>

 </service>

</services>

ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚-лист послС этого ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Листинг 9.10. ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚-лист β€” Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ source.xml

<?xml version="1.0" encoding="windows-1251"?>

<people>

 <person id="p1">

  <name>Иван Π˜Π²Π°Π½ΠΎΠ²ΠΈΡ‡</name>

  <number>18005557684</number>

  <service id="MTNSMS"/>

 </person>

 <person id="p2">

  <name>Иван Никифорович</name>

  <number>447856273447</number>

  <service id="SMSHost"/>

 </person>

</people>

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ HTML-страницу с Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ.

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

<?xml version="1.0" encoding="windows-1251"?>

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/TransfΠΎrm">


 <xsl:output

  method="html"

  indent="yes"

  encoding="windows-1251"/>


 <!-- ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ адрСсата, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ - p1 -->

 <xsl:param name="id" select="p1"/>


 <xsl:template match="/">

  <html>

   <xsl:call-template name="head"/>

   <body>

    <xsl:apply-templates select="people"/>

   </body>

  </html>

 </xsl:template>


 <xsl:template match="people">

  <!-- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ список адрСсатов -->

  <xsl:apply-templates select="person"/>

  <!-- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ„ΠΎΡ€ΠΌΡƒ для Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ адрСсата -->

  <xsl:apply-templates select="person[@id=$id]" mode="form"/>

 </xsl:template>


 <xsl:template match="person">

  <!-- Если Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ адрСсат Π²Ρ‹Π±Ρ€Π°Π½ -->

  <xsl:if test="@id = $id">

   <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ имя Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках ΠΈ Π±Π΅Π· гипСрссылки -->

   <xsl:text>&#xA0;[&#хА0;</xsl:text>

   <xsl:value-of select="name"/>

   <xsl:text>&#xA0;]&#xA0;</xsl:text>

  </xsl:if>

  <!-- Если адрСсат Π½Π΅ Π²Ρ‹Π±Ρ€Π°Π½ -->

  <xsl:if test="@id != $id">

   <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ имя Π±Π΅Π· скобок ΠΈ с гипСрссылкой -->

   <xsl:text>&#xA0;&#хА0;&#хА0;</xsl:text>

   <A href="sms.asp?id={@id}">

    <xsl:value-of select="name"/>