пятница, 8 апреля 2011 г.

Создание сайта. Шаг 7. XSLT - что это такое?

В прошлом посте, мы сделали модуль "Верхнее меню", но не разобрали, как же он работает?

Давай те по строчкам разберем листинг скрипта::

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxml="urn:schemas-microsoft-com:xslt"
  xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets"
  exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets ">

<xsl:output method="xml" omit-xml-declaration="yes" />

<xsl:param name="currentPage"/>

<!-- Input the documenttype you want here -->
<xsl:variable name="level" select="1"/>

<xsl:template match="/">

<!-- The fun starts here -->
<ul>
<xsl:for-each select="$currentPage/ancestor-or-self::* [@level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']">
  <li>
    <a href="{umbraco.library:NiceUrl(@id)}">
      <xsl:value-of select="@nodeName"/>
    </a>
  </li>
</xsl:for-each>
</ul>

</xsl:template>

</xsl:stylesheet>​

Строка 01:
<?xml version="1.0" encoding="UTF-8"?>
Стандартный заголовок XML-файла.

Строка 02:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
Здесь мы задаем, как будет отображаться специальная комбинация символов &nbsp; (пробел).


Строка 03-09:
<xsl:stylesheet 
version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxml="urn:schemas-microsoft-com:xslt" 
xmlns:umbraco.library="urn:umbraco.library"
xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings"
xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" 
exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets "> 
Список подключаемых библиотек, функции которых мы можем использовать в этом примере мы используем ф-цию umbraco.library:NiceUrl(...).


Строка 10:
<xsl:output method="xml" omit-xml-declaration="yes" /> 
Определяем метод вывода информации, в нашем случае XML (HTML).


Строка 12:
<xsl:param name="currentPage"/>
Единственный наш параметр currentPage, его инициализирует Umbraco и присваивает ему значение объект текущая страница. Грубо говоря, каждая наша страница представляется, как XML файл определенной структуры.


Строка 15:
<xsl:variable name="level" select="1"/>
Задаем параметр, который указывает страницы какого уровня мы выводим.


Строка 16:
<xsl:template match="/">
Начало корневого Template, отсюда начинает выполняться наш скрипт.


Строка 20, 28:
<ul>....</ul>
Часть верстки (не нумерованный список) в которую мы будем добавлять пункты меню.


Строка 21, 27:
<xsl:for-each select="$currentPage/ancestor-or-self::* [@level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']">
.....
</xsl:for-each>
Собственно сам цикл, который делает xpath запрос:
$currentPage/ancestor-or-self::* [@level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']
И получает все дочерние страницы уровня $level. А параметр string(umbracoNaviHide) != '1' говорит, что страница должна быть опубликована.


Строка 22-26:
<li> 
    <a href="{umbraco.library:NiceUrl(@id)}"> 
      <xsl:value-of select="@nodeName"/> 
    </a> 
</li> 
Выводим пункт меню. Функция umbraco.library:NiceUrl(@id) - по ID страницы возвращает "красивый" URL адрес это страницы.
<xsl:value-of select="@nodeName"/>
- Выводит название Нашей страницы со вкладки "Propertie", этот параметр можно заменить скажем на "nameField".

Комментариев нет:

Отправить комментарий