Корневой узел является узлом XPath, который содержит весь XML документ; это лучшее место для старта. В примере tij_menu.xml корневой узел будет содержать элемент <restaurant>. В выражении XPath корневой узел указывается одиночным слешем -/.

Корневой узел отличается, поскольку он не имеет родителя. Он всегда имеет хотя бы один дочерний узел. Строковое значение корневого узла является конкатенацией всех дочерних текстовых узлов корневого узла. Давайте начнем наше преобразование tij_menu.xml в menu.html путем добавления шаблонов действия для корневого узла. Вот menu1.xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <HTML>
            <HEAD>
                <TITLE>Menu</TITLE>
            </HEAD>
            <BODY>

            </BODY>
        </HTML>
    </xsl:template>

</xsl:stylesheet>

Теперь наш вывод приручен, но у нас нет ничего из нашего файла tij_menu.xml. Весь текст из дочерних узлов потерян. Вот menu1.html:

<HTML>
    <HEAD>
        <META http-equiv="Content-Type"
            content="text/html; charset=UTF-8" />
        <TITLE>Menu</TITLE>
    </HEAD>
    <BODY></BODY>
</HTML>

Мы погрузились в наш простой xml файл только до уровня корневого элемента. Мы напечатали явную оболочку HTML файла. Следующая задача - это пройти по структуре данных нашего tij_menu.xml. Так как мы имеем дело с древесной структурой XML документа, и мы только что обработали корневой узел - это означает, что мы просто применяем эти шаблоны для дочерних узлов, которые соответствуют шаблонам. Это выполняется с помощью элемента <xsl:apply-templates>.

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

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <HTML>
            <HEAD>
                <TITLE>Menu</TITLE>
            </HEAD>
            <BODY>
                <xsl:apply-templates />
            </BODY>
        </HTML>
    </xsl:template>

    <xsl:template match="restaurant">
        <center>
            <h2>
                <xsl:value-of select="name" />
            </h2>
            <h3>
                <xsl:value-of select="address/addr1" />
                <br />
                <xsl:value-of select="address/city" />
                ,
                <xsl:value-of select="address/state" />
                Phone:
                <xsl:value-of select="phone" />
                <br />
            </h3>
        </center>
    </xsl:template>

</xsl:stylesheet>

Внутри корневого правила я добавил тэг <xsl:apply-templates/>. Он трансформирует все дочерние узлы корневого элемента. Так как корневой элемент содержит только один элемент, <restaurant>, правило будет добавлено в обработчик <restaurant>.

<xsl:template match=”restaurant”> является правилом, которое будет отменено, когда XSLT процессор покинет тэг <restaurant>. Так как только в этом тэге нам необходимо трансформировать данные. Эти данные станут заголовком для меню нашего ресторана - имя ресторана, адрес и номер телефона.

Вывод после трансляции выглядит так:

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Menu</TITLE>
</HEAD>
<BODY>
<center>
<h2>TIJ's Restaurant</h2>
<h3>108 Java Sapien Avenue<br>Wayne,
    PA<br>
    Phone:  610-687-1234<br>
</h3>
</center>
</BODY>
</HTML>

Теперь давайте построим меню. Каждый ресторан имеет, как минимум, один элемент <menu>, элемент <menu> имеет <menugroup>, а элемент <menugroup> имеет <menuitem>. Так что нам осталось добавить остаток правил для обработки этих элементов.

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


    <xsl:template match="/">
        <HTML>
            <HEAD>
                <TITLE>Menu</TITLE>
            </HEAD>
            <BODY>
                <xsl:apply-templates />
            </BODY>
        </HTML>
    </xsl:template>

    <xsl:template match="restaurant">
        <center>
            <h2>
                <xsl:value-of select="name" />
            </h2>
            <h3>
                <xsl:value-of select="address/addr1" />
                <br />
                <xsl:value-of select="address/city" />
                ,
                <xsl:value-of select="address/state" />
                <xsl:value-of select="address/zip" />
            </h3>
        </center>
        <xsl:apply-templates select="menu" />
    </xsl:template>

    <xsl:template match="menu">
        <h2>Menu</h2>
        <dl>
            <xsl:apply-templates select="menugroup" />
        </dl>
    </xsl:template>

    <xsl:template match="menugroup">
        <dt>
            <h3>
                <spacer type="horizontal" size="25" />
                <xsl:value-of select="@desc" />
            </h3>
        </dt>
        <xsl:apply-templates select="menuitem" />
    </xsl:template>

    <xsl:template match="menuitem">
        <dd>
            <b>
                <spacer type="horizontal" size="25" />
                <xsl:value-of select="name" />
                :
            </b>
            <br />
            <ul>
                <xsl:apply-templates select="description" />
                Price:
                <xsl:value-of select="price" />
                <br />
            </ul>
        </dd>
    </xsl:template>

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

</xsl:stylesheet>

Элемент <menu> не имеет текстовых узлов, а только элементы <menugroup>. Таким образом, целью при работе с шаблоном меню является создание групп меню так, чтобы они были правильно разграничены и вызывали шаблон группы меню.

Группа меню имеет атрибут, описывающий тип группы меню. Это атрибут desc элемента <menugroup>. Символ "@" должен быть помещен перед именем атрибута, чтобы было выбрано значение с помощью тэга value-of - <xsl:value-of select="@desc"/>. оставшаяся часть правила, кроме описанной, выполняет установки для элемента списока внутри группы меню - <menuitem>.

Правило для <menuitem> выделяет жирным шрифтом имя продукта, затем создает ненумерованный список для оставшихся элементов <menuitem>. Так как некоторые элементы меню имеют описания, а некоторые не имеют, правило создается специально для описания. Если элемент меню имеет описание, правило будет вызвано, а текстовый узел description будет передан в метод text( ) поля выбранного атрибута.

Вот как выглядит заключительная форма HTML.

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