(Продолжение, начало см. в МК № 48, 51—52, 3, 5 (167, 170—171, 174, 176)) В предыдущей статье мы познакомились с некоторыми элементами XSL, позволяющими оформлять те документы XML, которые имеют регулярную структуру. Мы рассмотрели пример форматирования CD-каталога в виде таблицы HTML, причем для построения таблицы использовался цикл по элементам исходного документа. Напомню, что пример, разобранный в прошлой статье, можно просмотреть в окне Internet Explorer 5.0 даже в том случае, если на компьютере пользователя не установлен майкрософтовский parser 3.0. Такая «универсальность» стала возможной благодаря использованию «устаревшего» пространства имен, которое, несмотря на некоторое несоответствие последним стандартам консорциума W3C, можно в полной мере использовать с Internet Explorer. В этой статье мы также будем применять старое пространство имен, чтобы обеспечить широкому кругу читателей возможность поработать со стилевыми таблицами XSL без необходимости устанавливать специальный анализатор XML. Тем не менее, я все же рекомендую установить parser 3.0 для того, чтобы вы могли исследовать все возможности XML, предусмотренные его современными стандартами.
Выбор за нами
Продолжим рассмотрение способов форматирования документов XML, имеющих регулярную структуру. Мы уже научились оформлять исходный код в виде таблицы HTML, отсортированной по определенному полю. Следующий шаг — форматирование элементов таблицы, выбор которых осуществляется в соответствии с некоторыми критериями. Напомню, что поиск элементов, подлежащих преобразованию, осуществляется с помощью конструкций XPath, а для их форматирования используются шаблоны XSLT, хотя провести четкую границу между XPath и XSLT довольно трудно.
Рассмотрим следующий документ XML:
<?xml version="1.0" ?> <?xml:stylesheet type="text/xsl" href="products.xsl" ?> <PRODUCTS> <PRODUCT> <ID>Z1487</ID> <NAME>Milk</NAME> <PRODUCER>MyCompany</PRODUCER> <PRICE>12.35</PRICE> <DATE>31.01.02</DATE> </PRODUCT> <PRODUCT> <ID>A1692</ID> <NAME>Meat</NAME> <PRODUCER>HisCompany</PRODUCER> <PRICE>31.38</PRICE> <DATE>21.02.02</DATE> </PRODUCT> <PRODUCT> <ID>C2346</ID> <NAME>Vodka</NAME> <PRODUCER>HerCompany</PRODUCER> <PRICE>62.25</PRICE> <DATE>11.12.01</DATE> </PRODUCT> <PRODUCT> <ID>A1356</ID> <NAME>Meat</NAME> <PRODUCER>TheirCompany</PRODUCER> <PRICE>60.05</PRICE> <DATE>10.11.01</DATE> </PRODUCT> </PRODUCTS>
Сохраните этот текст в файле products.xml. Предположим, требуется вывести данные о различных продуктах, причем необходимо выделить с помощью специального форматирования всех производителей мяса (meat). Для визуализации данного документа построим специальную стилевую таблицу:
<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <body> <table border="2" bgcolor="yellow"> <tr> <th>Identifier</th> <th>Name</th> <th>Producer</th> <th>Price</th> <th>Date</th> </tr> <xsl:for-each select="PRODUCTS/PRODUCT"> <tr> <td><xsl:value-of select="ID"/></td> <td><xsl:value-of select="NAME"/></td> <xsl:choose> <xsl:when match=".[NAME='Meat']"> <td bgcolor="#ff0000"> <xsl:value-of select="PRODUCER"/> </td> </xsl:when> <xsl:otherwise> <td><xsl:value-of select="PRODUCER"/></td> </xsl:otherwise> </xsl:choose> <td><xsl:value-of select="PRICE"/></td> <td><xsl:value-of select="DATE"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Сохраните этот текст в файле products.xsl. Обратите внимание, что в этой таблице используется старое пространство имен (<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">). Как обычно, пройдем по документу XSL сверху вниз и разберемся, как он работает. Начнем с содержимого узла xsl:for-each, так как смысл текста, расположенного выше этого узла, очевиден (создается таблица и задается строка заголовка для этой таблицы). Элемент xsl:for-each определяет цикл по всем элементам PRODUCT. Далее в цикле создается строка таблицы, и первые две ячейки этой строки заполняются содержимым узлов ID и NAME (в ячейки заносятся идентификатор и наименование продукта). Узел xsl:choose («choose» означает «выбрать») используется для организации условного форматирования (скорее всего, вы уже встречали этот термин при работе с электронными таблицами Excel, где существует возможность форматирования ячейки в зависимости от некоторых условий). Если в рассматриваемой строке содержимое узла NAME равно Meat, то ячейка этой строки, расположенная в поле PRODUCER, окрашивается в красный цвет (таким способом выделяется производитель данного продукта):
<xsl:when match=".[NAME='Meat']"> <td bgcolor="#ff0000"> <xsl:value-of select="PRODUCER"/> </td> </xsl:when>
Если же наименование продукта отлично от Meat, то форматирование ячейки, содержащей информацию о производителе, не отличается от форматирования всей таблицы (используется желтый фон, как указано в строке

