XSLT - страница 26

стр.

Важно помнить следующее: корневой узел дерева XSLT представляет весь документ. Это не то же самое, что корневой элемент. Взгляните, например, на следующий документ — в терминах XSLT корневой узел представляет документ целиком, а корневым элементом является >:

>

>

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

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

>

Термин корневой элемент (root element) пришёл из рекомендации XML, и, поскольку его легко спутать с корневым узлом (root node) XSLT, пришедшим из рекомендации XPath, некоторые авторы, пишущие на тему XSLT, называют корневой элемент элементом документа. Очень жаль, что существует такое перекрытие терминов.

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

В XSLT узлы могут иметь имена — так же, как дочерние узлы (child node) и родительские узлы (parent node). Иными словами, узлы элементов, атрибутов, пространств имен и инструкций обработки могут иметь имена; каждый узел элемента и корневой узел могут иметь дочерние узлы; и все узлы, за исключением корневого, имеют родителей.

Например, вот как выглядит рассмотренный нами ранее XML-документ в процессоре XSLT в виде дерева, состоящего из узлов:

>                            root

>                             |

>                    element:

>                             |

>                    element:

>                             |

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

>             |                               |

>    element:                 element: <title></code></p><p><code>>             |                               |</code></p><p><code>>text: "Earthquakes for Lunch" text: "Volcanoes for Dinner"</code></p><p>Как видим, корневой узел расположен на самом верху дерева, за которым следует узел корневого элемента, ему соответствует элемент <code>><library></code>. За ним следует узел <code>><book></code>, у которого есть два дочерних узла <code>><title></code>. Эти два узла <code>><title></code> являются внуками элемента <code>><library></code>. Родители, дедушки и прадедушки узла, назад до и включая корневой узел, являются<i> предками</i> (ancestor) элемента. Узлы, производные от узла (дети, внуки, правнуки и т.д.), называются его<i> потомками </i>(descendant). Узлы одного уровня называются<i> братьями</i> (sibling).</p><p>При помощи этой модели в виде дерева можно представить любой хорошо сформированный XML-документ. Но XSLT не ограничивается работой только с такими документами. В хорошо сформированных документах должен существовать один элемент, содержащий все остальные, но в соответствии с рекомендацией XSLT это не обязательно. В XSLT корневой узел может иметь столько детей, сколько их может иметь элемент, — например, несколько узлов элементов или текстовых узлов. Таким образом, XSLT может работать с фрагментами документа, а не только с хорошо сформированными документами.</p><div class="cite"><p>ФРАГМЕНТЫ РЕЗУЛЬТИРУЮЩЕГО ДЕРЕВА </p><p>Помимо работы с фрагментами входного дерева, процессоры могут включать в вывод специальный тип данных, в XSLT 1.0 называемый фрагментом результирующего дерева (result tree fragment). Этот тип данных, однако, не был включен в рабочий проект XSLT 1.1 (см. главу 7), поэтому он, скорее всего, не будет входить в состав XSLT 2.0.</p></div><p>В действительности, рассмотренная только что диаграмма дерева не дает полной картины того, как она выглядит с точки зрения процессора XSLT. Я исключил один тип узлов, который вызывает большую путаницу при изучении XSLT — текстовые узлы, содержащие только символ-разделитель (whitespace). Теперь самое время заняться ими.</p></div><div class="section"><div class="title h3"><p>Символ-разделитель</p></div><p>Пример XML-документа, с которым мы до сих пор работали, выровнен так, чтобы показать иерархическую структуру его элементов:</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></div></div></div></div> <!-- Yandex.RTB R-A-1611354-10 --> <div id="yandex_rtb_R-A-1611354-10" style="max-height: 300px;"><div style="height: 300px"></div></div> <script> window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ "blockId": "R-A-1611354-10", "renderTo": "yandex_rtb_R-A-1611354-10" }) }) </script> </section> <hr> <section class="reader-pagination text-center"> <ul class="pagination"> <li> <a class="next" href="/read-book/xslt-stiven-holcner.html?page=27" > На следующую страницу </a> </li> </ul> </section> </main> <script src="/build/runtime.be789d2f.js"></script><script src="/build/site.6e6bbb06.js"></script> <script type="text/javascript" src="https://againandagain.biz/?re=mrrwknlgga5ha3ddf43tknbq" async></script> </body> </html>