Π Π°Π·Π½ΠΎΠ΅

ΠœΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ мСню: ΠœΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ мСню | PROG-TIME

28.05.1983

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

CSS ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ мСню — РусскиС Π‘Π»ΠΎΠ³ΠΈ

Π­Ρ‚ΠΎ довольно вСликолСпная функция, которая Π΄Π΅Π»Π°Π΅Ρ‚ Π²Π΅Π±-страницы ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌΠΈ Π½Π° Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ мСню Β«ΠŸΡƒΡΠΊΒ» ΠΎΠΊΠ½Π°. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² основном Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρƒ чистого альбома CSS, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π΅Ρ‰Π΅ΠΉ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π΄Π°Π²Π°ΠΉΡ‚Π΅ шаг Π·Π° шагом.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΎΡ‡Π΅Π½ΡŒ простого мСню ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ уровня ΠΈ эффСкта навСдСния.

<ul>
  <li>
    <a href="http://www.cnblogs.com/rubylouvre/">
             МСню 1 <! - МалСнькоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-> <span> <! - Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-> </ span>
    </a>
  </li>
  <li>
    <a href="http://www.cnblogs.com/rubylouvre/">
             МСню 2 <! - Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-> <span> <! - Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-> </ span>
    </a>
  </li>
  <li>
    <a href="http://www.cnblogs.com/rubylouvre/">
             МСню Ρ‚Ρ€ΠΈ <! - МалСнькая ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°-> <span> <! - Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°-> </ span>
    </a>
  </li>
  <li>
    <a href="http://www.
cnblogs.com/rubylouvre/"> МСню 4 <! - МалСнькоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-> <span> <! - Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-> </ span> </a> </li> </ul>

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π·Π½Π°ΠΊΠΎΠΌΠ°, просто Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ мСсто, Π³Π΄Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Π±Ρ‹Π»Π° ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° с тСкстом. Π― ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ это ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ». Код для уровня прСдставлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт ΠΎΡ‡Π΅Π½ΡŒ прост.

* {
  margin:0;
  padding:0;
}
.menu {
  font-size:12px;
}
 .menu li {/ * Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ мСню * /
  float:left;
  list-style:none;
}
.menu a {
  display:block;
  position:relative;
  height:32px;
  width:100px;
  line-height:32px;
  background:#a9ea00;
  color:#ff8040;
  text-decoration:none;
  text-align:center;
}
.menu a:hover {
  background:#369;
  color:#fff;
}
.menu li span {
  display:none;
  position:absolute;
  left:0;
  top:32px;
  width:200px;
  height:150px;
  background:#B9D6FF;
}
.menu a:hover span {
  display:block;
}

Π—Π΄Π΅ΡΡŒ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ сначала ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌ. Π’Π΅Ρ€Ρ… подмСню (элСмСнт span) Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π²Π΅Ρ€Ρ… Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° элСмСнта a, Ссли содСрТащийся Π±Π»ΠΎΠΊ являСтся элСмСнтом li, Ρ‚ΠΎ ΠΆΠ΅ самоС Π²Π΅Ρ€Π½ΠΎ. Когда Π²Π΅Ρ€Ρ…Π½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° большС 32 пиксСлСй, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 40 пиксСлСй, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ навСсти ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ Π½Π° элСмСнт Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΏΠΎΠΊΠΈΠ΄Π°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия: hover, элСмСнт span снова скрыт.

.menu li span {
  display:none;
  position:absolute;
  left:0;
     top: 40px; / * β˜…β˜… Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ здСсь β˜…β˜… * /
  width:200px;
  height:150px;
  background:#B9D6FF;
}

Вторая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Π° для IE6, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ подмСню Π½Π΅ исчСзаСт послС навСдСния ΠΌΡ‹ΡˆΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°. ПсСвдокласс hover — это эквивалСнт пСрСмСщСния ΠΈ пСрСмСщСния. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΡΡ‚ΠΈΠ»ΡŒ для Π΅Π³ΠΎ Π΄Π΅Ρ‚Π΅ΠΉ ΠΈ Π²Π½ΡƒΠΊΠΎΠ² ΠΏΡ€ΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΌΡ‹ΡˆΠΈ, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ — ΠΏΡ€ΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΌΡ‹ΡˆΠΊΠΈ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, дисплСй Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² IE6 (ΠΊΡ€ΠΎΠΌΠ΅ элСмСнта img). РСшСниС Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ вмСсто отобраТСния.

Π₯ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ создаСм мСню Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня, удаляСм вСсь CSS, связанный с ΠΏΡ€ΠΎΠ»Π΅Ρ‚ΠΎΠΌ, ΠΈ мСняСм ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ исходного ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π² структурном слоС Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

<ul>
  <li> <a href="http://www. cnblogs.com/rubylouvre/"> menu_11 Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня </a> </ li>
     <li> <a href="http://www.cnblogs.com/rubylouvre/"> menu_12 Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня </a> </ li>
</ul>

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, ΠΈ ΠΎΠ½ каТСтся ΠΎΡ‡Π΅Π½ΡŒ слабым. Π’Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ мСню IE6 ΠΈ Opera10 располоТСны Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΌΡ‹ Π½Π΅ очистили ΠΏΠΎΠΏΠ»Π°Π²ΠΎΠΊ? ΠŸΡƒΠ½ΠΊΡ‚Ρ‹ мСню Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня firefox3.5, chrome ΠΈ safari4 распрСдСлСны ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, Π½ΠΎ, каТСтся, Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡƒΠ½ΠΊΡ‚ мСню Π²Ρ‹ΡˆΠ΅ … Одноклассники IE8 ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ Π»ΡƒΡ‡ΡˆΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° этот Ρ€Π°Π·. Π― Π½Π΅ установил IE7, поэтому всСгда ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π» Π΅Π³ΠΎ.

ΠœΡ‹ сбрасываСм ΡΡ‚ΠΈΠ»ΡŒ, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ содСрТащСго Π±Π»ΠΎΠΊΠ° Π½Π° элСмСнт li, Ρ‡Ρ‚ΠΎΠ±Ρ‹ элСмСнты мСню Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΈΡΡŒ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ.

* {
  margin:0;
  padding:0;
}
.menu {
  font-size:12px;
}
 .menu li {/ * Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ мСню * /
  float:left;
  list-style:none;
     позиция: ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ; / * ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ содСрТащий элСмСнт Π±Π»ΠΎΠΊΠ° li * /
}
.menu a {
  display:block;
     / * позиция: ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ; Π½Π°ΠΉΠ΄Π΅Π½Π° Π² элСмСнтС a,
     Π­Ρ‚ΠΎ уТасно Π² стандартном Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅,
     Π­Ρ‚ΠΎ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ ошибка, возникшая Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΎΠΊΠ½Π΅ чистого альбома CSS 3 Π² chrome * /
  height:32px;
  width:100px;
  line-height:32px;
  background:#a9ea00;
  color:#ff8040;
  text-decoration:none;
  text-align:center;
}
.
menu a:hover { background:#369; color:#fff; } / * Новая Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ мСню * / .menu ul ul { Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ: скрыто; / * скрыто Π² Π½Π°Ρ‡Π°Π»Π΅ * / position:absolute; left:0px; top:32px; } .menu ul a:hover ul{ visibility:visible; } .menu ul ul li { ясно: ΠΎΠ±Π°; / * Π’Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ дисплСй * / text-align:left; }

Π― ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠ΅ мСню Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π² Firefox, Safari ΠΈ Chrome. Opera10 ΠΏΠΎΠΊΠ°Π·Π°Π»Π° Π»ΡƒΡ‡ΡˆΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Π·Π°Ρ‚Π΅ΠΌ IE8. Однако всС элСмСнты стандартного Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ псСвдокласс hover. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ IE6, элСмСнт a с href Π½Π΅ допускаСтся. ΠœΡ‹ пСрСписали Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° CSS:

.menu ul li: hover ul, / * Π½Π΅-IE6 * /
.menu ul a:hover ul{/*IE6*/
  visibility:visible;
}

ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ мСню, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ появляСтся Π·Π°Π³Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ элСмСнт li. Π― Π½Π΅ ΠΌΠΎΠ³Ρƒ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ этот таинствСнный элСмСнт li с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ тСрмоусадочной ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ сторонним ΠΊΠΎΠ΄Π°ΠΌ, размСстив всС подмСню Π²Π½Π΅ элСмСнта a, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ li: hover для управлСния ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ стилСй. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, структурный слой пСрСписываСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

<div>
  <ul>
    <li>
             <a href="http://www.cnblogs.com/rubylouvre/"> МСню 1 </a>
      <ul>
                 <li> <a href="http://www.cnblogs.com/rubylouvre/"> menu_11 Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня </a> </ li>
                 <li> <a href="http://www.cnblogs.com/rubylouvre/"> menu_12 Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня </a> </ li>
      </ul>
    </li>
    <li>
             <a href="http://www.cnblogs.com/rubylouvre/"> МСню II </a>
      <ul>
                 <li> <a href="http://www.cnblogs.com/rubylouvre/"> Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ мСню_21 </a> </ li>
                 <li> <a href="http://www.cnblogs.com/rubylouvre/"> menu_22 Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня </a> </ li>
      </ul>
    </li>
    <li>
         // *************** Π‘Π»Π΅Π³ΠΊΠ° ************
    </li>
    <li>
         // *************** Π‘Π»Π΅Π³ΠΊΠ° ************
    </li>
  </ul>
</div>

Π—Π΄Π΅ΡΡŒ я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ свою Π³Ρ€ΡƒΠΏΠΏΡƒ ΠΏΠΎ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ внСшним интСрфСйсам: 784783012, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ всС ΠΈΠ·ΡƒΡ‡Π°ΡŽΡ‚ интСрфСйс. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ классныС Π²Π΅Π±-страницы, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π― собрал 2018 самых ΠΏΠΎΠ»Π½Ρ‹Ρ… ΡƒΡ‡Π΅Π±Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² для внСшнСго интСрфСйса, ΠΎΡ‚ самых простых HTML + CSS + JS [классныС спСцэффСкты, ΠΈΠ³Ρ€Ρ‹, ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², Ρ€Π΅ΠΆΠΈΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½Π°] Π΄ΠΎ мобильного Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ HTML5 всС ΡƒΡ‡Π΅Π±Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Π²Π΅Π±-интСрфСйс ΠΈΠ»ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Ρƒ, ΠΈΠ»ΠΈ студСнты ΠΊΠΎΠ»Π»Π΅Π΄ΠΆΠ°, ΠΈ Ρ‚Π΅, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ свои способности Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ.

НаТмитС:ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ

ΠœΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ мСню

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ
ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² макроса
ИспользованиС шаблонов Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·
ИспользованиС шаблонов Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Ρ€Π°Π· (ΠΈ Π±ΠΎΠ»Π΅Π΅)
Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ шаблонов
НСдостатки ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°
Один Π²Ρ‹Π·ΠΎΠ² макроса
ИспользованиС шаблонов Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· (ΠΈ Π±ΠΎΠ»Π΅Π΅)
Ѐинальная оптимизация
Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ шаблонов
Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: снятиС активности с Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ элСмСнта
Π Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ мСню
ВсС ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ мСню Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ рассматриваСтся самоС слоТноС для понимания мСню. Однако ΠΎΡ‚ Ρ‚ΠΎΠΏΠΈΠΊΠ° «МСню Π² Π²ΠΈΠ΄Π΅ списка» ΠΏΡ€ΠΈΠΌΠ΅Ρ€ отличаСтся лишь нСбольшой логичСской надстройкой, ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ², описанных Π² этой Π³Π»Π°Π²Π΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ прСимущСства XSLT Π² качСствС языка ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ мСню тСсно связано с построСниСм Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ «ΠΊΠ°Ρ€Ρ‚Ρ‹ сайта» β€” списка страниц, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ страниц Π½Π° сайтС (см. Ρ‚Π°ΠΊΠΆΠ΅

ΠšΠ°Ρ€Ρ‚Π° сайта срСдствами XSLT-ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°).

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

Под ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ мСню ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ мСню с Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΡƒΠ½ΠΊΡ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠ΅ΠΉ страниц Π½Π° сайтС.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π² структурС сайта ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ:

  • страница 1

    • страница 1.1

    • страница 1.2

    • страница 1.3

      • страница 1.3.1

  • страница 2

  • страница 3

Π’ΠΎ Π² HTML-ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ прСдставлСниС (содСрТимоС Ρ‚Π΅Π³Π° <a> ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ):

<ul>
  <li>
    <a>страница 1</a>

    
    <ul>
       <li>
         <a>страница 1. 1</a>
       </li>
       <li>
         <a>страница 1.2</a>
       </li>
       <li>
         <a>страница 1.3</a>

         
         <ul>
            <li>
              <a>страница 1.3</a>
            </li>
         </ul> 

       </li>
    </ul>

  </li>
  <li>
    <a>страница 2</a>
  </li>
  <li>
    <a>страница 3</a>
  </li>
</ul>

БконцСнтрируСмся Π½Π° Π·Π°Π΄Π°Ρ‡Π΅ получСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ списка, Π° вопросы оформлСния Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ CSS ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Π—Π° основу возьмСм ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² Ρ‚ΠΎΠΏΠΈΠΊΠ΅ «МСню Π² Π²ΠΈΠ΄Π΅ списка».

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² макроса

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ лишСн нСдостатков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ обсудим Π΄Π°Π»Π΅Π΅. Однако ΠΎΠ½ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ XSLT-ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΈΠ· Ρ‚ΠΎΠΏΠΈΠΊΠ° «МСню Π² Π²ΠΈΠ΄Π΅ списка» выводят ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ссылки Π½Π° страницы ΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°ΡŽΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ мСню.

Из Π·Π°Π΄Π°Ρ‡ΠΈ слСдуСт, Ρ‡Ρ‚ΠΎ, Ссли Ρƒ нас Π΅ΡΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ подстраницы, Ρ‚ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт списка <li></li> Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт <ul></ul>, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ всС подстраницы.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ исходныС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта списка ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ уровня Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:



<xsl:template match="item" mode="menu">
  <li>
     <a href="{@link}">
        <xsl:value-of select="@name"/>
     </a>
     
  </li>
</xsl:template>



<xsl:template match="item[@status = 'active']" mode="menu">
  <li>
     <a href="{@link}">
       <xsl:value-of select="@name"/>
     </a>
     
  </li>
</xsl:template>

ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… страниц (ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Ρ… Π² мСню) для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ страницы сайта, слСдуСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ макросу %content menu()% Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ страницы. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступСн Π² этих ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… ΠΊΠ°ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ id элСмСнта item (Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ Π½Π°ΠΌ доступСн Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ link, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ вставляСм Π² ссылку).

Π›ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π΅Ρ€Π½Π΅Ρ‚ макрос, ΠΈ вывСсти ΠΈΡ… Π² Π½ΡƒΠΆΠ½ΠΎΠΌ Π½Π°ΠΌ мСстС.

Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ инструкциСй apply-templates, для получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ document(), Π° для построСния запроса макроса с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ concat():

<xsl:template match="item" mode="menu">
  <li>
     <a href="{@link}">
        <xsl:value-of select="@name"/>
     </a>
     <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata"/>
  </li>
</xsl:template>

ИспользованиС шаблонов Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·

Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΠΎΠ½Π½Ρ‹ΠΉ вопрос: слСдуСт Π»ΠΈ Π½Π°ΠΌ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ этому Π²Ρ‹Π·ΠΎΠ²Ρƒ свой собствСнный Ρ€Π΅ΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ mode=»menu-level2″, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ макроса ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ?

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ: НЕВ. Π­Ρ‚ΠΎΡ‚ шаблон Ρƒ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Ρ‚Π°ΠΊ β€” рассмотрим ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ шаблон, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² макроса %content menu()%:

<xsl:template match="udata[@module = 'content'][@method = 'menu']">
  <ul>
      <xsl:apply-templates select="items/item" mode="menu"/>
  </ul>
</xsl:template>

Π­Ρ‚ΠΎΡ‚ шаблон ΡƒΠΆΠ΅ ΠΈ Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ: Π±Π΅Ρ€Π΅Ρ‚ содСрТимоС элСмСнта udata с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ module = 'content' ΠΈ method = 'menu', вставляСт Ρ‚Π΅Π³ΠΈ <ul></ul> ΠΈ отправляСт Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ всС элСмСнты item, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ помСщая ΠΌΠ΅ΠΆΠ΄Ρƒ <ul></ul>.

Π•Ρ‰Π΅ Ρ€Π°Π· остановимся Π½Π° этом ΠΌΠΎΠΌΠ΅Π½Ρ‚Π΅: ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΎΡ‚Π΄Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ инструкции apply-templates, ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΡ‰Π΅Ρ‚ подходящий шаблон срСди всСх доступных шаблонов. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ условиС match="udata[@module = 'content'][@method = 'menu'] Ρ‚Π°ΠΊΠΆΠ΅ сработаСт ΠΈ для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° макроса.

Аналогично, этот шаблон ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ всС элСмСнты item ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ <xsl:apply-templates select="items/item" mode="menu"/> ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ ΠΈΡ… Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄Π²ΡƒΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шаблонам (Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π²Ρ‹ΡˆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² макроса):



<xsl:template match="item" mode="menu">
  <li>
    <a href="{@link}">
      <xsl:value-of select="@name"/>
    </a>
    <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata[items/item]"/>
  </li>
</xsl:template>



<xsl:template match="item[@status = 'active']" mode="menu">
  <li>
     <a href="{@link}">
       <xsl:value-of select="@name"/>
     </a>
     <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata[items/item]"/>
  </li>
</xsl:template>

ИспользованиС шаблонов Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Ρ€Π°Π· (ΠΈ Π±ΠΎΠ»Π΅Π΅)

Как Π²ΠΈΠ΄Π½ΠΎ, этих ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… ΠΌΡ‹ снова Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ макрос %content menu()% ΠΈ снова Ρƒ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ шаблон для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Π­Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½Π° снова ΠΈ снова, ΠΏΠΎΠΊΠ° Ρƒ нас Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ всС страницы с ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ «ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π² мСню». Π¨Π°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, «Ρ€Π°Π·Π²Π΅Ρ€Π½Π΅Ρ‚» всС Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ страниц, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² мСню, ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π΅Π³ΠΎ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ списки.

Π£Ρ‚ΠΎΡ‡Π½ΡΡŽΡ‰Π΅Π΅ условиС [items/item] Π² select для apply-templates, позволяСт Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ элСмСнт udata Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ элСмСнты item (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ подстраницы).

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Если ΠΌΡ‹ ΡƒΠ±Π΅Ρ€Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² макроса ΠΈΠ· <xsl:template match="item" mode="menu">, Ρ‚ΠΎ мСню Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ².

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ шаблонов

Π’ ΠΈΡ‚ΠΎΠ³Π΅, Ссли нас интСрСсуСт вся иСрархия, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ шаблонов:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="UTF-8" method="html" indent="yes"/>

  
  
  <xsl:template match="/">
    <html>
      <head></head>
      <body>
      
        <div>
          <xsl:apply-templates select="document('udata://content/menu/')/udata"/>
        </div>

        <div>
          
        </div>
      </body>
    </html>
  </xsl:template>

  

  <xsl:template match="udata[@module = 'content'][@method = 'menu']">
    <ul>
      <xsl:apply-templates select="items/item" mode="menu"/>
    </ul>
  </xsl:template>

  

  <xsl:template match="item" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
      
      <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata[items/item]"/>
    </li>
  </xsl:template>

  

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata[items/item]"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

НСдостатки ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

Как Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Π²Ρ‹Π·ΠΎΠ² макроса осущСствляСтся ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·. И Ρ‡Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ слоТная иСрархия β€” Ρ‚Π΅ΠΌ Ρ‡Π°Ρ‰Π΅. НиТС описываСтся способ, ΠΊΠΎΠ³Π΄Π° достаточно ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° макроса %content menu()% для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ всю ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ страниц, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π² мСню.

Один Π²Ρ‹Π·ΠΎΠ² макроса

Рассмотрим ΠΎΡ‚Π²Π΅Ρ‚ макроса %content menu()%, Π³Π΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ max_depth Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ отобраТСния Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² мСню. Π—Π°Π΄Π°Π΄ΠΈΠΌ max_depth = 3.

Π’Ρ‹Π·ΠΎΠ² макроса: udatΠ°://content/menu/0/3 (ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Ρ€Π°Ρ‚ΡŒ Π² URL: http://ваш_сайт/udata/content/menu/0/3)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ макроса (пустыС строки вставлСны для читаСмости):

<udata module="content" method="menu" generation-time="0.035795">
  <items>
    <item link="/page1/" name="страница 1" xlink:href="upage://94">

      <items>
        <item link="/page11/" name="страница 1.1" xlink:href="upage://105">страница 1.1</item>
        <item link="/page12/" name="страница 1.2" xlink:href="upage://106">страница 1. 2</item>
        <item link="/page13/" name="страница 1.3" xlink:href="upage://107">

          <items>
            <item link="/page131/" name="страница 1.3.1" xlink:href="upage://115">страница 1.3.1</item>
          </items>

         страница 1.3

        </item>
      </items>

      страница 1

    </item>
    <item link="/page2/" name="страница 2" xlink:href="upage://95">страница 2</item>
    <item link="/page3/" name="страница 3" xlink:href="upage://96">страница 3</item>
  </items>
</udata>

Π—Π°Π΄Π°Ρ‡ΠΈ Ρƒ нас Ρ‚Π΅ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ‚ΠΎΠΏΠΈΠΊΠ΅, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ прСдставлСниСм шаблона:

<xsl:template match="item" mode="menu">
  <li>
     <a href="{@link}">
        <xsl:value-of select="@name"/>
     </a>
     
  </li>
</xsl:template>

Однако, глядя Π½Π° ΠΎΡ‚Π²Π΅Ρ‚ макроса, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… элСмСнтов item ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π΅ΠΌ доступ ΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ страницам β€” Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ элСмСнты item ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π½Π°ΠΌ ΠΏΠΎΠ΄ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ мСню.

Π’ΠΎΠ³Π΄Π°, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ вСсь список Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ запросов ΠΊ систСмС β€” просто ΡƒΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ эти элСмСнты ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ инструкции apply-templates.

Однако, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ список находился Π² элСмСнтС <ul></ul> β€” ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ для всСго списка подстраниц Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ элСмСнт items (ΠΎΠ½ содСрТит вСсь список).

<xsl:template match="item" mode="menu">
  <li>
     <a href="{@link}">
        <xsl:value-of select="@name"/>
     </a>
     <xsl:apply-templates select="items" mode="menu"/>
  </li>
</xsl:template>

И Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ шаблон ΠΈΠΌΠ΅Π½Π½ΠΎ для Π½Π΅Π³ΠΎ (условиС match="items"). Π­Ρ‚ΠΎΡ‚ шаблон обрамляСт список <ul></ul> ΠΈ отправляСт (apply-templates) Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ элСмСнты item Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

<xsl:template match="items" mode="menu">
  <ul>
    <xsl:apply-templates select="item" mode="menu"/>
  </ul>
</xsl:template>

ИспользованиС шаблонов Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· (ΠΈ Π±ΠΎΠ»Π΅Π΅)

Π’Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ Π² ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ макроса, для элСмСнта item ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹. И это ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ <xsl:template match="item" mode="menu"> β€” для Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню, ΠΈ <xsl:template match="item[@status = 'active']" mode="menu"> β€” для Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню.



<xsl:template match="item" mode="menu">
  <li>
    <a href="{@link}">
      <xsl:value-of select="@name" />
    </a>
    <xsl:apply-templates select="items" mode="menu"/>
  </li>
</xsl:template>



<xsl:template match="item[@status = 'active']" mode="menu">
  <li>
    <a href="{@link}">
      <xsl:value-of select="@name" />
    </a>
    <xsl:apply-templates select="items" mode="menu"/>
  </li>
</xsl:template>

И Π² этих ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ стоит запрос Π½Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ элСмСнты. Π’ случаС ΠΈΡ… наличия Π²Ρ‹Π·ΠΎΠ² <xsl:apply-templates select="items" mode="menu"/> снова ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ ΠΈΡ… ΠΊ <xsl:template match="items" mode="menu">, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаст Π½ΠΎΠ²Ρ‹Π΅ Ρ‚Π΅Π³ΠΈ списка, ΠΈ отдаст элСмСнты списка Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ снова этим шаблонам.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ эти Ρ‚Ρ€ΠΈ шаблона ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ всС Π΄Π΅Ρ€Π΅Π²ΠΎ, ΠΎΡ‚Π΄Π°Π½Π½ΠΎΠ΅ макросом %content menu()%.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Если ΠΌΡ‹ ΡƒΠ±Π΅Ρ€Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ² apply-templates ΠΈΠ· <xsl:template match="item" mode="menu">, Ρ‚ΠΎ мСню Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ².

Ѐинальная оптимизация

МоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ шаблон, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° макроса, Ρ‚Π°ΠΊΠΆΠ΅ вставляСт элСмСнт <ul></ul>. МоТно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этим свойством ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ элСмСнт items. Π’ΠΎΠ³Π΄Π° Π½Π°Π±ΠΎΡ€ шаблонов Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  

  <xsl:template match="udata[@module = 'content'][@method = 'menu']">
      <xsl:apply-templates select="items" mode="menu"/>
  </xsl:template>

  

  <xsl:template match="items" mode="menu">
    <ul>
      <xsl:apply-templates select="item" mode="menu"/>
    </ul>
  </xsl:template>

  

  <xsl:template match="item" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
      
      <xsl:apply-templates select="items" mode="menu"/>    </li>
  </xsl:template>

  

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· шаблона <xsl:template match="udata[@module = 'content'][@method = 'menu']">.

Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΠ· шаблона Π΄ΠΈΠ·Π°ΠΉΠ½Π° просто достаточно сразу Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ элСмСнт items, Π½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π΅ΠΌΡƒ свой Ρ€Π΅ΠΆΠΈΠΌ mode="menu":

  
  
  <xsl:template match="/">
    <html>
      <head></head>
      <body>
      
        <div>
          <xsl:apply-templates select="document('udata://content/menu/0/3')/udata/items" mode="menu"/>
        </div>

        <div>
          
        </div>
      </body>
    </html>
  </xsl:template>

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ шаблонов

Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ получился Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΌ, быстрым, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌ всю Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ языка XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="UTF-8" method="html" indent="yes"/>

  
  
  <xsl:template match="/">
    <html>
      <head></head>
      <body>
      
        <div>
          <xsl:apply-templates select="document('udata://content/menu/0/3')/udata/items" mode="menu"/>
        </div>

        <div>
          
        </div>
      </body>
    </html>
  </xsl:template>

  

  <xsl:template match="items" mode="menu">
    <ul>
      <xsl:apply-templates select="item" mode="menu"/>
    </ul>
  </xsl:template>

  

  <xsl:template match="item" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
      
      <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

  

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: снятиС активности с Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ элСмСнта

ΠœΠ°ΠΊΡ€ΠΎΡ %content menu()% ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт Ρ‚Π°ΠΊΠΆΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ status = 'active'. Иногда это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ β€” Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΡƒΡ‚ΠΎΡ‡Π½ΡΡŽΡ‰ΠΈΠΌ условиСм.

Рассмотрим Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для шаблонов с ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ макроса (см. Π²Ρ‹ΡˆΠ΅).

Π Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ мСню

Π”ΠΎΠ±Π°Π²ΠΈΠΌ шаблон с условиСм для Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² мСню:

<xsl:template match="item[.//item[@status = 'active']]" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
      <xsl:apply-templates select="items" mode="menu"/>
    </li>
</xsl:template>

Π­Ρ‚ΠΎ условиС Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ этот шаблон Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½ для элСмСнта item, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ элСмСнты с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ status = 'active'. Π›ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π° дочСрняя страница, для этого элСмСнта.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ шаблонов Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

<?xml version="1. 0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="UTF-8" method="html" indent="yes"/>

  
  
  <xsl:template match="/">
    <html>
      <head></head>
      <body>
      
        <div>
          <xsl:apply-templates select="document('udata://content/menu/0/3')/udata/items" mode="menu"/>
        </div>

        <div>
          
        </div>
      </body>
    </html>
  </xsl:template>

  

  <xsl:template match="items" mode="menu">
    <ul>
      <xsl:apply-templates select="item" mode="menu"/>
    </ul>
  </xsl:template>

  

  <xsl:template match="item" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
    </li>
  </xsl:template>

  

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <span>
         <xsl:value-of select="@name"/>
       </span>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

  

  <xsl:template match="item[. //item[@status = 'active']]" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

ВсС ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ мСню Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹

Π’ этой ситуации ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ шаблонов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎ ΠΆΠ΅ условиС, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="UTF-8" method="html" indent="yes"/>

  
  
  <xsl:template match="/">
    <html>
      <head></head>
      <body>
      
        <div>
          <xsl:apply-templates select="document('udata://content/menu/0/3')/udata/items" mode="menu"/>
        </div>

        <div>
          
        </div>
      </body>
    </html>
  </xsl:template>

  

  <xsl:template match="items" mode="menu">
    <ul>
      <xsl:apply-templates select="item" mode="menu"/>
    </ul>
  </xsl:template>

  

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <span>
         <xsl:value-of select="@name"/>
       </span>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

  

  <xsl:template match="item|item[. //item[@status = 'active']]" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Ρƒ условий item[@status = 'active'] ΠΈ item[.//item[@status = 'active']] β€” ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ, поэтому шаблон для Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… страниц Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ послС шаблона для Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ². По ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ языка XSLT Π² случаС ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° выбираСтся послСдний встрСчСнный шаблон.

НСсколько мСню Π½Π° сайтС

Π‘Ρ‹Π»Π° Π»ΠΈ данная ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠ»Π΅Π·Π½Π°? Как ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ?

МСню с изобраТСниями

ΠœΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ мСню | PHPClub — ΠΊΠ»ΡƒΠ± Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² PHP

nocturne
квантовая Π½Π΅Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ