XSL
Материал из Википедии — свободной энциклопедии
XSL (Extensible Stylesheet Language) — расширяемый язык таблиц стилей.
- Стилевые таблицы XSL позволяют определять оформление элемента в зависимости от его месторасположения внутри документа, то есть к двум элементам с одинаковым названием могут применяться различные правила форматирования.
- Языком, лежащем в основе XSL, является XML, а это означает, что XSL более гибок, универсален и у разработчиков появляется возможность использования средства для контроля за корректностью составления таких стилевых списков(используя DTD или схемы данных)
- Таблицы XSL не являются каскадными, подобно CSS, так как чрезвычайно сложно обеспечить «каскадируемость» стилевых описаний, или, другими словами, возможность объединения отдельных элементов форматирования путём вложенных описаний стиля, в ситуации, когда структура выходного документа заранее неизвестна и он создаётся в процессе самого разбора. Однако в XSL существует возможность задавать правила для стилей, при помощи которых можно изменять свойства стилевого оформления, что позволяет использовать довольно сложные приёмы форматирования.
[править] Немного деталей
Разработчики обычно не задумываются о разнице в использовании терминов XSL и XSLT. На самом деле, спецификация XSL состоит из двух довольно-таки независимых частей:
- XSL-T (XSL Transformations), язык для преобразования XML и
- XSL-FO (XSL Formatting Objects), язык для вёрстки XML.
XSL — трансформация
С помощью XSL можно трансформировать XML документ в любой вид, будь то HTML, WML, RTF, PDF, SQL, даже в SWF (flash запускаемый модуль), а так же в XML и XSL. XSL несёт в себе информацию о том, как будет оформлен документ, где и как должны располагаться данные.
Самой доступной XSL-T машиной на данный момент является Internet Explorer начиная с версии 4.5 и выше. Под Linux — xsltproc. Для того, чтобы обработать XML документ c помощю XSL, необходимо в XML документе написать следующую инструкцию:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="my-style.xsl"?> <root> < !-- ... -- > </root>
Под Linux:
$ xsltproc -o result.html my-style.xsl document.xml
XSLT
Язык XSLT состоит из трёх с половиной десятков инструкций, все они имеют общий вид:
<пространство-имен:имя-инструкции [атрибут="значение" [атрибут="значение"]]> </пространство-имён:имя-инструкции>,
где пространство-имен обычно «xsl», но могут использоваться и другие.
XSLT документ всегда является состоятельным(или валидным) XML документом и имеет следующую структуру:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> < !-- набор инструкций -- > </xsl:template> < !-- ... -- > </xsl:stylesheet>
xsl:stylesheet — является корневым элементом для любого XSL документа. В него могут быть вложены теги верхнего уровня. (xsl:transform — устаревший синоним для xsl:stylesheet)
XSL-FO
Пример XSL-FO документа (взят из XSL Formatting Objects Tutorial):
<?xml version="1.0" encoding="iso-8859-1"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="my-page"> <fo:region-body margin="1in"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="my-page"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hello, world!</fo:block> </fo:flow> </fo:page-sequence> </fo:root>
[править] Секреты мастерства
Итерационный цикл
XML:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="for.xsl"?> <root/>
for.xsl:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="root"> <HTML> <BODY> <xsl:call-template name="for"> <xsl:with-param name="i" select="1"/> <xsl:with-param name="n" select="5"/> </xsl:call-template> </BODY> </HTML> </xsl:template> <xsl:template name="for"> <xsl:param name="i"/> <xsl:param name="n"/> <xsl:value-of select="$i"/> <xsl:if test="$i < $n"> <xsl:text>, </xsl:text> <xsl:call-template name="for"> <xsl:with-param name="i" select="$i+1"/> <xsl:with-param name="n" select="$n"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
Результат:
1, 2, 3, 4, 5
Группировка и сортировка годов
XML:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="years.xsl"?> <root> <object year="2003"/> <object year="2001"/> <object year="2005"/> <object year="2005"/> <object year="2003"/> <object year="2006"/> <object year="2006"/> <object year="2006"/> <object year="2005"/> <object year="2001"/> </root>
years.xsl:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:key name="years" match="/root/object" use="@year" />
<xsl:template match="root" priority="-1"> <HTML> <BODY> <xsl:for-each select="object[generate-id()=generate-id(key('years',@year))]"> <xsl:sort select="@year" order="descending"/>
<xsl:value-of select="@year" /> <xsl:if test="not(position()=last())"> <xsl:text>, </xsl:text> </xsl:if> </xsl:for-each> </BODY> </HTML> </xsl:template> </xsl:stylesheet>
Результат:
2006, 2005, 2003, 2001
Ещё примеры
«Готовые решения» — 11-я глава из онлайн-версии книги Алексея Валикова «Технология XSLT».