Автор: Fade
Источник: habrahabr
<?xml-stylesheet type="text/xsl" href="template.xsl" ?>
<?xml version="1.0" encoding="windows-1251"?>
<document lang="ru" id="0">
<header>
<title>Начало</title>
</header>
<lang_table>
<item hit="yes" lang="ru" title="Russian"/>
</lang_table>
<navigation>
<sections>
<item id="0" parent_id="0" is_published="1" section="1">
<title>Начало</title>
<dir>/</dir>
</item>
<item id="1" parent_id="0" is_published="1" section="1">
<title>Новости</title>
<dir>news</dir>
</item>
</sections>
</navigation>
<content>
<item id="1" container="1" sorting="2" type="com" method="list_news"
title="Новости"></item>
</content>
</document>
<?xml version="1.0" encoding="windows-1251"?>
- заголовок
XML-файла. Должен идти строго с начала файла. В нем прописана версия
используемого XML-языка и кодировка документа. Я как правило работаю в
windows-1251 (пока так удобнее), но, по идее UTF-8
лучше.<document lang="ru" id="0">
- корневой элемент документа (можно
придумать свое имя). Атрибуты:<lang_table>
- таблица языков, используемых на сайте.<navigation>
- блок элементов навигации:<sections>
- блок основной навигации (основная структура сайта):<item id="0" parent_id="0" is_published="1" section="1">
- элемент
структуры сайта. Атрибуты: <content>
- блок содержимого.<item id="1" container="1" sorting="2" type="com"
method="list_news" title="Новости">
<!DOCTYPE site_page [
<!-- Character entity references for ISO 8859-1 characters -->
<!ENTITY nbsp " ">
<!ENTITY sect "§" >
<!ENTITY copy "©">
<!ENTITY laquo "«">
<!ENTITY reg "®">
<!ENTITY deg "°">
<!ENTITY plusmn "±">
<!ENTITY para "¶">
<!ENTITY raquo "»">
<!ENTITY times "×">
<!-- Character entity references for symbols, mathematical symbols, and Greek
letters -->
<!ENTITY bull "•">
<!ENTITY hellip "…">
<!-- Character entity references for markup-significant and internationalization
characters -->
<!ENTITY ndash "–">
<!ENTITY mdash "—">
<!ENTITY lsquo "‘">
<!ENTITY rsquo "’">
<!ENTITY sbquo "‚">
<!ENTITY ldquo "“">
<!ENTITY rdquo "”">
<!ENTITY bdquo "„">
<!ENTITY lsaquo "‹">
<!ENTITY rsaquo "›" >
<!ENTITY euro "€">
]>
<?xml version="1.0" encoding="windows-1251"?>
....
<h1 class="top">
<!-- Название раздела -->
Администрирование сайта
<!-- /Название раздела -->
</h1>
...
<!-- меню -->
<ul id="main-menu">
<li><a href="#">Начало</a></li>
<li class="curent-item"><a href="#">Новости</a></li>
<li><a href="#">Разделы</a></li>
</ul>
<!-- /меню -->
...
<!-- блок левых модулей -->
Всякие новости
<!-- /блок левых модулей -->
...
<!-- Блок основного содержимого -->
Текст
<!-- /Блок основного содержимого -->
...
<xsl:stylesheet version = `1.0` encoding="UTF-8"?>
<xsl:template match="element">
данные шаблона
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version = `1.0` encoding="UTF-8"?>
-
определяет тип XML-документа и кодировку. Я использую
UTF-8 (не спрашивайте, почему).<xsl:stylesheet> </xsl:stylesheet>
- начало и конец XSL-документа.
<xsl:template match="element"> </xsl:template>
- начало и конец
шаблона для элемента element.<xsl:template match="element"></xsl:template>
- шаблон,
описывающий правила преобразования элемента element.
Применяется автоматически ко всем элементам element.<xsl:template match="element" mode="mode1"></xsl:template>
- шаблон, описывающий правила преобразования элемента element
в режиме mode1. Таким образом можно описать различные
правила обработки элементов element.<xsl:template name="template-name"></xsl:template>
- шаблон
с именем template-name. Не имеет привязки к какому-либо
элементу XML-документа.<xsl:template match="navigation/sections/item"></xsl:template>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "../dtd/entities.dtd">
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Основной шаблон -->
<xsl:template match="/node()">
</xsl:template>
<!-- / Основной шаблон -->
</xsl:stylesheet>
<xsl:template match="/node()"> </xsl:template>
- шаблон для
элемента /node() (корневого). Вместо /node()
можно указать //document, т.к. он у нас являеться корневым
узлом.<xsl:template
match="/node()"></xsl:template>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- общий файл шаблона -->
<xsl:import href=" my_template /layout.xsl"/>
</xsl:stylesheet>
<xsl:import href="my_template/layout.xsl"/>
<navigation>
<sections>
<item id="0" parent_id="0" is_published="1" section="1">
<title>Начало</title>
<dir>/</dir>
</item>
<item id="1" parent_id="0" is_published="1" section="1" hit="yes">
<title>Новости</title>
<dir>news</dir>
</item>
</sections>
</navigation>
<item>
<item></item>
</item>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "../dtd/entities.dtd">
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Глобальное меню навигации -->
<xsl:template match="sections" mode="global_menu">
</xsl:template>
<!-- /Глобальное меню навигации -->
</xsl:stylesheet>
<!-- Глобальное меню навигации -->
<xsl:template match="sections" mode="global_menu">
<ul id="main-menu">
<li class="curent-item"><a href="/">Начало</a></li>
<li><a href="/sections/">Разделы</a></li>
<li><a href="/news/">Новости</a></li>
</ul>
</xsl:template>
<!-- /Глобальное меню навигации -->
<!-- меню -->
<xsl:apply-templates select="navigation/sections" mode="global_menu"/>
<!-- /меню -->
<xsl:import href="navigation.xsl"/>
<!-- Обработка ссылок меню -->
<xsl:template match="item" mode="global_menu">
<li>
<a>
<xsl:call-template name="href_attribute"/>
<xsl:value-of select="title"/>
</a>
</li>
</xsl:template>
<!-- /Обработка ссылок меню -->
<xsl:call-template name="href_attribute"/>
- вызов шаблона по
имени. При этом шаблон не имеет привязки к элементу, т.е. вызывается
произвольно. <xsl:value-of select="title"/>
- вставка-вывод значения элемента
title текущего элемента. Если в параметре перед именем элемента поставить символ
@ - выводиться будет значения атрибута текущего элемента.<!-- Глобальное меню навигации -->
<xsl:template match="sections" mode="global_menu">
<ul id="main-menu">
<xsl:apply-templates select="item" mode="global_menu"/>
</ul>
</xsl:template>
<!-- /Глобальное меню навигации -->
<xsl:apply-templates select="item" mode="global_menu"/>
- обработка
всех элементов item элемента sections. При
этом, элементы item самих элементов item (sections/item/item)
обрабатываться не будут, т.е. выводиться только один уровень меню разделов.
<xsl:call-template name="href_attribute"/>
<!-- Обработка ссылок меню -->
<xsl:template match="item" mode="global_menu">
<li>
<xsl:choose>
<!-- если Текущий раздел -->
<xsl:when test="descendant-or-self::*/@id = /node()/@id">
<xsl:value-of select="title"/>
</xsl:when>
<!-- если раздел не текщий -->
<xsl:otherwise>
<a>
<xsl:call-template name="href_attribute"/>
<xsl:value-of select="title"/>
</a>
</xsl:otherwise>
</xsl:choose>
</li>
</xsl:template>
<!-- /Обработка ссылок меню -->
<xsl:choose>
<xsl:when></xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
<xsl:when
test="descendant-or-self::*/@id = /node()/@id">
<xsl:when></xsl:when>
располагается то, что выводиться
в случае выполнения условия. В блоке <xsl:otherwise></xsl:otherwise>
- если условие не выполняется.<!-- Обработка адреса ссылок меню -->
<xsl:template name="href_attribute">
<xsl:attribute name="href">
<xsl:text>/</xsl:text>
<xsl:for-each select="ancestor-or-self::item">
<xsl:value-of select="dir"/>
<xsl:text>/</xsl:text>
</xsl:for-each>
</xsl:attribute>
</xsl:template>
<!-- /Обработка адреса ссылок меню -->
<xsl:for-each select="ancestor-or-self::item">
задает
цикл обработки для всех элементов, удовлетворяющих условию. В нашем случае мы
выбираем ancestor-or-self::item - ось элементов от корневого
элемента до текущего по цепочке. В нашем случае это позволяет выбрать для всей
цепочки узлы dir, т.е. построить полный адрес текущего
узла-раздела.
|
Программирование для чайников.
|