XSLT - [22]

Шрифт
Интервал

Однако, с точки зрения XSLT, символы-разделители, используемые для выравнивания элементов, в действительности являются текстовыми узлами. Это означает, что по умолчанию эти пробелы будут скопированы в выходной документ. Понимание принципов работы XSLT с разделителями всегда вызывает большую путаницу, поэтому мы кратко рассмотрим здесь, как обрабатывать символы-разделители, и подробно займемся этим в следующей главе.

В XSLT существует четыре символа-разделителя: пробел, возврат каретки, перевод строки и табуляция. Все эти символы трактуются как разделители. Таким образом, с точки зрения процессора XSLT, входной документ выглядит так:

>

>

>.

>..</code></p><p><code>>...Earthquakes for Lunch</code></p><p><code>>..

>..</code></p><p><code>>...Volcanoes for Dinner</code></p><p><code>>..

>.

>

Все разделители между элементами трактуются в XSLT как текстовые узлы, содержащие символ-разделитель. Это означает, что в нашу диаграмму нам нужно добавить пять текстовых узлов с символом-разделителем: один перед элементом >, один после элемента >, и точно так же один перед элементом ></code>, один после и один между элементами:</p><p><code>>                                      root</code></p><p><code>>                                        |</code></p><p><code>>                               element: <library></code></p><p><code>>                                        |</code></p><p><code>>                    |-------------------|------------|</code></p><p><code>>                    |                   |            |</code></p><p><code>>              text: whitespace element: <book> text: whitespace</code></p><p><code>>                                        |</code></p><p><code>>      |-------------------|-------------|-------------------|-------------|</code></p><p><code>>      |                   |             |                   |             |</code></p><p><code>>text: whitespace element: <title> text: whitespace element: <title> text: whitespace</code></p><p><code>>                          |                                 |</code></p><p><code>>             text: "Earthquakes for Lunch"   text: "Volcanoes for Dinner"</code></p><p>Такие узлы-разделители, как эти, представляют собой текстовые узлы, не содержащие ничего, кроме символа-разделителя. Поскольку процессоры XSLT по умолчанию сохраняют эти разделители, вас не должно удивлять их появление в результирующих документах. Такие дополнительные разделители обычно не представляют проблемы в документах HTML, XML и XHTML, и здесь в тексте результирующих документов я их не отображаю — для того, чтобы правильно показать выравниванием структуру документа. Мы рассмотрим, как процессоры XSLT могут удалять узлы-разделители из документов, а также как процессоры могут выравнивать результирующие документы. Заметьте, что текстовые узлы, содержащие символы, отличные от символов-разделителей, не считаются узлами-разделителями, поэтому они никогда не будут удалены из документов.</p><p>Следует отметить еще один момент: сами атрибуты трактуются как узлы. Хотя узлы-атрибуты не считаются дочерними узлами тех элементов, в которых они появляются, элемент считается их родительским узлом. (В этом отличие данной модели от модели XML DOM, в которой атрибуты не являются детьми и не имеют родителей.) Если я добавлю атрибут в такой элемент:</p><p><code>><?xml version="1.0"?></code></p><p><code>><library></code></p><p><code>> <book></code></p><p><code>>  <title></code></p><p><code>>   Earthquakes for Lunch</code></p><p><code>> 

>  </code></p><p><code>>   Volcanoes for Dinner</code></p><p><code>> 

>

то в дереве документа он отобразится следующим образом:

>                                    root

>                                      |

>                               element:

>                                      |

>                  |-------------------|------------|

>                  |                   |            |

>              text: whitespace element: text: whitespace

>                                      |

>    |-------------------|-------------|-------------------|-------------|

>    |                   |             |                   |             |

>text: whitespace element: text: whitespace element: <title> text: whitespace</code></p><p><code>>                        |                                 |</code></p><p><code>>       text: Earthquakes for Lunch        |--------------------------|</code></p><p><code>>                                          |                          |</code></p><p><code>>                            text: Volcanoes for Dinner      attribute: pub_date="2001"</code></p><p>У каждого узла есть ряд установленных свойств, связанных с ним в XSLT. В следующем списке перечислены виды свойств, которые создатели процессоров XSLT отслеживают для каждого узла:</p><p>• <b>Имя</b>. Имя узла;</p><p><b>• Строка-значение</b>. Текст узла;</p><p>• <b>Базовый URI</b>. Базовый URI узла (XML-вариант URL);</p><p>• <b>Дети</b>. Список дочерних узлов; ноль, если детей нет;</p><p>• <b>Родитель</b>. Узел-родитель данного узла;</p><p>• <b>Имеет атрибут</b>. Определяет атрибуты узла элемента, если таковые имеются;</p><p>• <b>Имеет пространство имен</b>. Определяет узлы пространства имен узла-элемента.</p><p>При работе с деревьями следует принять во внимание еще одно соображение; процессоры XSLT работают поверх разборщиков XML, и так как правила для разборщиков XML и процессоров XSLT слегка различаются, это может привести к проблемам. В некоторых случаях данный аспект может быть важен, поэтому в следующем разделе он кратко рассмотрен.</p></div></div><div class="section"><div class="title h3"><p>Модель информационного множества против модели дерева XSLT</p></div></div></div> <div class="show-more show-more_reader text-center my-4"> <a class="btn btn-primary" href="/chi/xslt-holcner?p=23" > Продолжить чтение </a> </div> </section> <section> <div class="pagination-container"> <nav> <ul class="pagination"> <li class="page-item"> <a class="page-link" href="/k/xslt-holcner#tx">1</a> </li> <li class="page-item disabled"> <span class="page-link">…</span> </li> <li class="page-item"> <a class="page-link" href="/chi/xslt-holcner?p=20#tx">20</a> </li> <li class="page-item"> <a class="page-link" href="/chi/xslt-holcner?p=21#tx">21</a> </li> <li class="page-item active"> <span class="page-link">22</span> </li> <li class="page-item"> <a class="page-link" href="/chi/xslt-holcner?p=23#tx">23</a> </li> <li class="page-item"> <a class="page-link" href="/chi/xslt-holcner?p=24#tx">24</a> </li> <li class="page-item disabled"> <span class="page-link">…</span> </li> </ul> </nav> </div> </section> <hr class="w-100"> </div> <section> <div class="h2 text-break">Рекомендуем почитать </div> <div class="container"> <div class="row"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/halyavnye-antivirusy-i-drugie-besplatnye-programmy-iz-halyavin" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/80/80339e1e4e151bdee0ca6a2923f6ac3c7c24ffff.jpg" alt="Халявные антивирусы и другие бесплатные программы из Интернета!" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/vasiliy-halyavin" > Василий Халявин </a> </div> <div> <a href="/k/halyavnye-antivirusy-i-drugie-besplatnye-programmy-iz-halyavin"><b>Халявные антивирусы и другие бесплатные программы из Интернета!</b></a> </div> <div class="book-card__description"> <p>Автор предлагает бесплатную, проверенную на практике, супернадежную и эффективную комплексную защиту от вирусов, шпионских программ, вторжения любопытных хакеров — любых попыток несанкционированного вторжения в ваш компьютер.Пользуясь советами автора, вы сможете не только выстроить надежную систему безопасности, но и контролировать те сайты, которые посещают ваши дети, а также без проблем восстановить операционную систему после любого сбоя и даже полного обрушения. Книга станет настольным пособием и у продвинутых пользователей, и у чайников благодаря простому и краткому изложению материала с подробными иллюстрациями каждого шага.</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/pribylnyy-blog-sozday-raskruti-i-zarabotay-litvin" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/00/00a1dff3fed505c567c5f11d595d2e4d118f64ad.jpg" alt="Прибыльный блог: создай, раскрути и заработай" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/evgeniy-litvin" > Евгений Литвин </a> </div> <div> <a href="/k/pribylnyy-blog-sozday-raskruti-i-zarabotay-litvin"><b>Прибыльный блог: создай, раскрути и заработай</b></a> </div> <div class="book-card__description"> <p>Что такое блог, сегодня знает каждый или практически каждый пользователь Интернета. И судя по стремительно возрастающему количеству блогов в Сети, для многих блогинг — достаточно серьезное увлечение. Но далеко не каждый знает, что это увлечение вполне может быть очень прибыльным. Как «заставить» блог приносить деньги? Как создать и раскрутить свой блог? Как выбрать целевую аудиторию и тематику? Ответы на эти и многие другие вопросы вы найдете в практическом руководстве Евгения Литвина.Откройте для себя профессиональные секреты успеха, узнайте, как хобби может приносить прибыль!</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/yandeks-dlya-vseh-abramzon" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/c7/c7446ed0e90016d91b89ce0c1651db51b794c679.jpg" alt="Яндекс для всех" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/mihail-grigorevich-abramzon" > Михаил Абрамзон </a> </div> <div> <a href="/k/yandeks-dlya-vseh-abramzon"><b>Яндекс для всех</b></a> </div> <div class="book-card__description"> <p>Рассказывается о ведущем поисковом ресурсе российской части Интернета — Яндексе. Описаны его сервисы для поиска документов и новостей, блогов и адресов, товаров и музыкальных произведений. Рассмотрены почтовый сервис и сервис для создания и размещения сайтов на Народ. ру. Читатель узнает о том, что такое "электронные деньги" и как с их помощью оплатить товар. Большое внимание уделяется общедоступным поисковым программам, которые Яндекс предлагает своим посетителям для поиска информации не только на сайтах, но и на своем компьютере.</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/google-proryv-v-duhe-vremeni-malsid" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/f1/f10b12f7cb9d0c684b0fc76b769d186f8da31445.jpg" alt="Google. Прорыв в духе времени" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/mark-malsid" > Марк Малсид </a> </div> <div> <a href="/k/google-proryv-v-duhe-vremeni-malsid"><b>Google. Прорыв в духе времени</b></a> </div> <div class="book-card__description"> <p>Эта книга – захватывающая история самой успешной Интернет-компании в мире. В последнее время финансовый результат деятельности Google Inc. превосходит даже самые смелые ожидания инвестиционных аналитиков.Целеустремленность, научный талант, творческий поиск, смелость и любовь к эксперименту основателей компании – бывшего москвича Сергея Брина и выходца из штата Мичиган Ларри Пейджа – проложили путь к долгосрочному успеху компании. Под их руководством поисковый механизм Google стал популярнейшим ресурсом, который пользователи любят за удобство и уже испытывают к нему сильную эмоциональную привязанность.</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/darknet-voyna-gollivuda-protiv-cifrovoy-revolyucii-lasika" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/19/191e7b3cc02310539dfb61ec47debc441afc7818.jpg" alt="Даркнет: Война Голливуда против цифровой революции" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/dzh-d-lasika" > Дж Ласика </a> </div> <div> <a href="/k/darknet-voyna-gollivuda-protiv-cifrovoy-revolyucii-lasika"><b>Даркнет: Война Голливуда против цифровой революции</b></a> </div> <div class="book-card__description"> <p>«Даркнет» – это рассказ о цифровой революции в мире медиа. В битве между технологическим прогрессом и медиа-магнатами решается будущее кино, музыки, телевидения, компьютерных игр и Интернета. В этой книге вы найдете истории людей, оказавшихся в эпицентре битвы. «Даркнет» увлечет вас в тайный мир киноподполья, где бутлегеры и пираты скрываются от закона и Голливуда. Но не только в подполье делается цифровая революция: множеству приверженцев цифрового образа жизни, творцам фан-фикшн, диджеев, кинематографистам-любителям, пионерам телевидения нового поколения и разработчикам игр приходится противостоять могущественным силам, стремящимся сохранить статус-кво.</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/obrazovanie-russkoyazychnogo-segmenta-fidonet-v-zapadnoy-sotnik" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/build/oblozhka.dc6e36b8.jpg" alt="Образование русскоязычного сегмента Фидонет в Западной Европе" > </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/aleks-sotnik" > Алекс Сотник </a> </div> <div> <a href="/k/obrazovanie-russkoyazychnogo-segmenta-fidonet-v-zapadnoy-sotnik"><b>Образование русскоязычного сегмента Фидонет в Западной Европе</b></a> </div> <div class="book-card__description"> <p> В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность. </p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/sql-bystroe-pogruzhenie-shilds" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/29/29898a504be895a627f66e03ba768e5c43765b18.jpg" alt="SQL: быстрое погружение" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/uolter-shilds" > Уолтер Шилдс </a> </div> <div> <a href="/k/sql-bystroe-pogruzhenie-shilds"><b>SQL: быстрое погружение</b></a> </div> <div class="book-card__description"> <p>Что общего между самыми востребованными профессиями и стремительным увеличением количества информации в мире? Ответ: язык структурированных запросов (SQL). SQL — рабочая лошадка среди языков программирования, основа основ для современного анализа и управления данными. Книга «SQL: быстрое погружение» идеальна для всех, кто ищет новые перспективы карьерного роста; для разработчиков, которые хотят расширить свои навыки и знания в программировании; для любого человека, даже без опыта, кто хочет воспользоваться возможностями будущего, в котором будут править данные.</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/chistyy-kod-sozdanie-analiz-i-refaktoring-martin" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/2d/2da20213e2b3b310834c440d1f42fd260e12f70c.jpg" alt="Чистый код. Создание, анализ и рефакторинг" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/robert-sesil-martin" > Роберт Мартин </a> </div> <div> <a href="/k/chistyy-kod-sozdanie-analiz-i-refaktoring-martin"><b>Чистый код. Создание, анализ и рефакторинг</b></a> </div> <div class="book-card__description"> <p>Даже плохой программный код может работать. Однако если код не является «чистым», это всегда будет мешать развитию проекта и компании-разработчика, отнимая значительные ресурсы на его поддержку и «укрощение». Эта книга посвящена хорошему программированию. Она полна реальных примеров кода. Мы будем рассматривать код с различных направлений: сверху вниз, снизу вверх и даже изнутри. Прочитав книгу, вы узнаете много нового о коде. Более того, вы научитесь отличать хороший код от плохого. Вы узнаете, как писать хороший код и как преобразовать плохой код в хороший. Книга состоит из трех частей.</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/izuchaem-python-metiz" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/c1/c135117f86c1ce4df13354fe252ad4a4bc50ecf6.jpg" alt="Изучаем Python" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/erik-metiz" > Эрик Мэтиз </a> </div> <div> <a href="/k/izuchaem-python-metiz"><b>Изучаем Python</b></a> </div> <div class="book-card__description"> <p>Книга "Изучаем Python" - это ускоренный курс, который позволит вам сэкономить время и сразу начать писать работоспособные программы (игры, визуализации данных, веб-приложения и многое другое). Хотите стать программистом? В первой части книги вам предстоит узнать о базовых принципах программирования, познакомиться со списками, словарями, классами и циклами, вы научитесь создавать программы и тестировать код. Во второй части книги вы начнете использовать знания на практике, работая над тремя крупными проектами: создадите собственную "стрелялку" с нарастающей сложностью уровней, займетесь работой с большими наборами данных и освоите их визуализацию, и, наконец, создадите полноценное веб-приложение на базе Django, гарантирующее конфиденциальность пользовательской информации. Если вы решились разобраться в том что такое программирование, не нужно ждать.</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/grokaem-algoritmy-illyustrirovannoe-posobie-dlya-bhargava" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/26/26649553b28ee71ac4c1c0f7709056f8f4d16096.jpg" alt="Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/aditya-bhargava" > Адитья Бхаргава </a> </div> <div> <a href="/k/grokaem-algoritmy-illyustrirovannoe-posobie-dlya-bhargava"><b>Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих</b></a> </div> <div class="book-card__description"> <p>Алгоритмы - это всего лишь пошаговые алгоритмы решения задач, и большинство таких задач уже были кем-то решены, протестированы и проверены. Можно, конечно, погрузится в глубокую философию гениального Кнута, изучить многостраничные фолианты с доказательствами и обоснованиями, но хотите ли вы тратить на это свое время? Откройте великолепно иллюстрированную книгу и вы сразу поймете, что алгоритмы - это просто. А грокать алгоритмы - это веселое и увлекательное занятие.</p> </div> </div> </div> <hr class="w-100"> </div> </div> </section> </main> </div> <script type="text/template" id="counter"> (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js", "ym"); ym(92475221, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true }); </script> <script> var commonTargetUrl = '22=p?rencloh-tlsx/tatihc/ten.vkubrim//:sptth'; </script> <script src="/build/runtime.5332280c.js" defer></script><script src="/build/site.2f232b70.js" defer></script> </div> <div class="modal fade" id="cookieModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Добро пожаловать</h5> </div> <div class="modal-body"> Наш сайт использует куки для сбора анонимной статистики. </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Отказаться</button> <button type="button" class="btn btn-primary" data-dismiss="modal">Согласиться</button> </div> </div> </div> </div> </body> </html>