Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<?php
my_func();
?>
посреди HTML-шаблона.<xsl:value-of select="my_param"/>
В этом случае все html-мнемоники автоматически экранируются.<xsl:value-of select="my_param" disable-output-escaping="yes"/>
В этом случае значение будет выведено как есть.а ваш Smarty придется забыть, как только смените платформу разработки, и изучать другой шаблонизатор
<xsl:for-each select="node/node[count(menu[@name='main_menu']) != 0]">...</xsl:for-each>
<xsl:value-of select="php:function('str_plural_form', 1*$cnt_users, 'пользователь', 'пользователя', 'пользователей')"/> могут вызывать утечку памяти на некоторых версиях php (см на php.net) <!-- Вывод информации о пользователе -->
<xsl:template match="*" mode="user">
<div class="user">
<xsl:apply-templates select="." mode="user_picture"/>
<xsl:value-of select="concat(first_name, ' ', last_name)"/>
</div>
</xsl:template>
<!-- Вывод фотографии пользователя -->
<xsl:template match="*" mode="user_picture">
<!-- По хорошему в xml нужно хранить путь до картинки целиком -->
<img class="user__avatar" src="/img/{string(userpic)}.png" />
</xsl:template>
<!-- Загрушка, если нету фотографии пользователя -->
<xsl:template match="*[not(userpic)]" mode="user_picture">
<span class="user__avatar user__avatar_default"></span>
</xsl:template>
<xsl:template match="*" mode="post">
<!-- Выводим пользователя из поста или найденного по user_id -->
<xsl:apply-templates select="(user|/*/ref_users/item[user_id=current()/user_id])[1]" mode="user"/>
</xsl:template>
<!-- Выводим текущего пользователя, или пользователей, соответствующих xpath выоражению -->
<xsl:apply-templates select="/*/cur_user" mode="user"/>
<script language='text/javascript'>
jQuery(function(){
//... do something
});
</script>
<xsl:output method="xml"
encoding="utf-8"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
media-type="text/html"
indent="yes"
undeclare-namespaces="yes"
omit-xml-declaration="yes"/><xsl:output method="html" version="1.0" omit-xml-declaration="yes" encoding="utf-8"/>
В таком случае генерируемый html будет более валиден. Кроме того метод method=«xml» не совсем подходит для генерации html. Были некоторые косяки, о которых сейчас не вспомню. Но мой выбор method=«html» вполне осознан. <script>
dtime = 43;
T_time=null;
$(function(){
downtime();
T_time=window.setInterval("downtime()", 1000);
});
</script>
<![CDATA[ тут всё что угодно ]]>
<!-- Создание тегов script -->
<xsl:template name="script-in-xhtml">
<!-- Вызов:
<xsl:call-template name="script-in-xhtml">
<xsl:with-param name="script-code">
<![CDATA[
alert("Test script");
]]>
</xsl:with-param>
</xsl:call-template>
-->
<xsl:param name="script-code" />
<xsl:param name="script-type" select="'text/javascript'"/>
<script type="{$script-type}">
<xsl:text disable-output-escaping="yes">
//<![CDATA[</xsl:text>
<xsl:value-of select="$script-code" disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes">//]]>
</xsl:text>
</script>
</xsl:template>
<![CDATA[
<script>if (a && b) document.wite('<b>'+a+', '+b+'</b>');</script>
]]>
<xsl:output method="xml"
encoding="utf-8"
standalone="yes"
indent="yes"
omit-xml-declaration="yes"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"/>
<xsl:output
method="html"
encoding="UTF-8"
doctype-public="-//W3C//DTD HTML 4.0//EN"
doctype-system="http://www.w3.org/TR/1998/REC-html40-19980424/strict.dtd"
indent="yes"
lang=""
omit-xml-declaration="no" />
<tag> </tag>
(даже с пробелами внутри в xsl шаблоне). И ещё что-то, но я не упомню, т.к. давно перешёл на вывод html вместо xml.<!-- SWeb banner code begins -->
<!--
<script type="text/javascript" src='http://ad.sweb.ru/b.js'></script>
<script type="text/javascript">sweb_bans_show(31, 11655);</script>
-->
<!-- SWeb banner code ends -->
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"<script>
<![CDATA[
if (a && b) document.wite('<b>'+a+', '+b+'</b>');
]]>
</script>
if (a && b) { ... }.if (eval('a ' + unescape('%26%26') + ' b') { ... })<xsl:output type="html"/>.<xsl:template name="declension">
<xsl:param name="int"/>
<xsl:param name="expr0"/>
<xsl:param name="expr1"/>
<xsl:param name="expr2"/>
<xsl:variable name="count" select="$int mod 100"/>
<xsl:choose>
<xsl:when test="$count >= 5 and $count <= 20">
<xsl:value-of select="$expr2"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="count1" select="$count mod 10"/>
<xsl:choose>
<xsl:when test="$count1 = 1">
<xsl:value-of select="$expr0"/>
</xsl:when>
<xsl:when test="$count1 >= 2 and $count <= 4">
<xsl:value-of select="$expr1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$expr2"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</div>, или написав нехорошее слово в заголовке сайта :)xsl:comment.xsl:choose, не лучше ли в этом случае использовать xsl:apply-templates, и несколько xsl:template? Вместо xsl:for-each/xsl:call-template/xsl:with-param нужно делать просто <xsl:apply-templates select="users/item"/> или <:xsl:apply-templates select="/*/cur_user"/> и сам шаблон: <xsl:template match="users/item|cur_user"> (в крайнем случае можно использовать параметр mode="user": <xsl:template match="*" mode="user"> и в <xsl:apply-templates mode="user">).disable-output-escaping="yes", допустимо его использовать только если вы получаете уже готовый XHTML контент, например после Markdown, но уж ни в коем случае не для заголовка и подвала сайта.cnt_users/@f_plural_form.xsl:apply-templates по той причине, что он заставляет плодить дополнительные xsl:template, в которых нет нужды. Моё правило «каждый xsl:template служит для определённой цели». Создание xsl:template для реализации простого ветвления не добавляет читаемости коду.xsl:apply-templates лучше, чем xsl:call-template.xsl:call-template за то, что такая запись приближает нас к процедурному языку, что может быть немного противоречит идеологии xslt.Например, на разных страницах может быть разный header.Так и шаблоны для заголовка могут быть в этом случае в тех же файлах, что используются для вывода конкретного объекта, получается что мы просто переопределяем шаблон, тем более, что есть такая штука как
<xsl:apply-imports/>.приближает нас к процедурному языку, что может быть немного противоречит идеологии xslt.Я идеологию и имел ввиду, функциональный подход в XSLT получается лучше, процедурный слишком многословен.
<xsl:call-template name="name"/> можно вполне использовать <xsl:apply-templates select="." mode="name"/>. Хотя вот автор топика не согласен с моим мнением, и вполне себе использует call-template.
Использование xslt-шаблонов в реальных проектах