XSL

XSL
Орган стандартизации Консорциум Всемирной паутины
Официальный сайт w3.org/TR/xslt/all/

XSL (eXtensible Stylesheet Language) — семейство рекомендаций консорциума W3C, описывающее языки преобразования и визуализации XML-документов. Состоит из трех частей:

  • XSL Transformations (XSLT) — язык преобразования XML-документов.
  • XSL Formatting Objects (XSL-FO) — язык разметки типографских макетов и иных предпечатных материалов.
  • XPath — язык путей и выражений, используемый в том числе и в XSLT для доступа к отдельным частям XML-документа.

Основные отличия от CSS

[править | править код]
  • CSS и XSL — принципиально разные технологии. Их области применения пересекаются лишь частично.
  • CSS-форматирование HTML-документа применяется браузером на клиентской стороне, а XSL-преобразование может выполняться как в браузере, так и на сервере.
  • Языком, лежащим в основе XSL, является XML, а это означает, что XSL более гибок, универсален, и у разработчиков появляется возможность использования средств контроля за корректностью составления таких стилевых списков (используя DTD или схемы данных).

Семейство XSL

[править | править код]

XSL-трансформация

[править | править код]

С помощью XSL можно трансформировать XML-документ в любой вид, будь то HTML, WML, RTF, PDF, SQL или даже SWF (flash-запускаемый модуль), а также XSL. XSL несёт в себе информацию о том, как будет оформлен документ, где и как должны располагаться данные.

Для того, чтобы обработать XML-документ c помощью XSL, необходимо в XML-документе написать следующую инструкцию:

  <?xml-stylesheet type="text/xsl" href="my-style.xsl"?> 

Язык XSLT состоит из 35 инструкций, все они имеют общий вид:

<префикс:имя-инструкции [атрибут="значение" [атрибут="значение"]]> </префикс:имя-инструкции>, 

где префикс — обычно «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).

Самым доступным XSLT-процессором на данный момент для Microsoft Windows является MSXML (поставляется с браузером Internet Explorer, начиная с версии 4.5), для систем на основе GNU — xsltproc.

Пример 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 &lt; $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="position()!=last()"> 						<xsl:text>, </xsl:text> 					</xsl:if> 				</xsl:for-each> 			</BODY> 		</HTML> 	</xsl:template> </xsl:stylesheet> 

Результат:

2006, 2005, 2003, 2001