§ 47. XSLT-шаблоны

Содержание

Программист: есть данные для новости и надо вывести соответствующий блок.

<news>
    <item>
        <title>...</title>
        <text>...</text>
    </item>
</news>

Верстальщик: ок (создает news.xsl)

<xsl:template match="/">
    ...
    <xsl:apply-templates select="news/item" />
</xsl:template>

<xsl:template match="news/item">
    <div class="news">
        <xsl:apply-templates select="title" />
        <xsl:apply-templates select="text" />
    </div>
</xsl:template>

<xsl:template match="title">
    <h3>
        <xsl:value-of select="text()" />
    </h3>
</xsl:template>

<xsl:template match="text">
    <p>
        <xsl:value-of select="text()" />
    </p>
</xsl:template>

Программист: у новости будет иногда картинка.

<news>
    <item>
        <title>...</title>
        <text>...</text>
        <img />
    </item>
</news>

Верстальщик: ок (вносит изменения в news.xsl)

<xsl:template match="news/item">
    <div class="news">
        <xsl:apply-templates select="img" />
        <xsl:apply-templates select="title" />
        <xsl:apply-templates select="text" />
    </div>
</xsl:template>

Программист: тут Игорь сказал, что нужны теги и источник, если известен.

<news>
    <item>
        <title>...</title>
        <text>...</text>
        <img />
        <source>...</source>
        <tags>
            <item>...</item>
            <item>...</item>
        </tags>
    </item>
</news>

Верстальщик: ок (вносит изменения в news.xsl)

<xsl:template match="news/item">
    <div class="news">
        <xsl:apply-templates select="img" />
        <xsl:apply-templates select="title" />
        <xsl:apply-templates select="text" />
        <xsl:apply-templates select="source" />
        <xsl:apply-templates select="tags" />
    </div>
</xsl:template>

Программист: на главной мы хотим отображать список последних новостей, но без текста и картинки поменьше.

Верстальщик: уберите из выдачи лишнее и картинки нужные вставьте.

Программист: ок.

<news>
    <item>
        <title>...</title>
        <img />
    </item>
    ...
</news>

Верстальщик: получите (создает index.xsl).

<xsl:import href="news.xsl" />

<xsl:template match="/">
    ...
    <xsl:apply-templates select="news" />
</xsl:template>

<xsl:template match="news">
    <div class="news-previews">
        <xsl:apply-templates />
    </div>
</xsl:template>

Программист: тут такое дело, хотим, чтобы была возможность показывать в новом разделе не только новость, но и связанные с ней другие, как на главной.

<news>
    <item>
        <title>...</title>
        <img />
        <news>
            <item>...</item>
        </news>
    </item>
    ...
</news>

Верстальщик: ок (создает related-news.xsl)

<xsl:import href="index.xsl" />

<xsl:template match="news/item">
    <xsl:apply-imports />
    <xsl:apply-templates />
</xsl:template>

За кадром остался момент: как верстальщик наследовал стили и добавлял свои? Естественно, верстальщик был правильным и клал все в head. А у каждого шаблона была конструкция, добавляющая в head что-то от себя:

<xsl:template match="/" mode="head">
    <style>...</style>
    <script>...</script>
</xsl:template>

При использовании news.xsl в index.xsl делалось включение стилей дочернего шаблона:

<xsl:template match="/" mode="head">
    <xsl:apply-imports />
    <style>...</style>
    <script>...</script>
</xsl:template>

В случае, если наследуются два шаблона, и каждый из них что-то добавляет в head, возникает интересный момент, что эти два шаблона не перекрывают друг друга, и в конечный apply-imports попадут стили обоих дочерних шаблонов: для этого соответствующие apply-imports нужно не забывать в каждом из них.

На данном примере я показываю, что, во-первых, XSLT позволяет создавать гибкие структуры шаблонов, и писать кода с каждым погружением требуется все меньше и меньше, а, во-вторых, выводом управляют входные данные, а не условия.

Уже на данном этапе видна польза от возможности верстальщику самому определять структуру сайта и самому определять для страницы набор входных данных. Но об этом я расскажу позже. Не менее очевидной становится польза от того, чтобы верстальщик был бы еще и дизайнером, потому что те, кто называют себя дизайнерами, не умеют проектировать оптимальную структуру (в том числе и визуальную).



5 сентября 2011 г.
Данила Ковчий
http://kovchiy.livejournal.com/62080.html