71
XSLT

Знакомство с XSLT

Embed Size (px)

Citation preview

XSLT

XSLT is . . .

XML

XSLT

XSL-FO

XPath

XSLT is . . .

XML

XSLT

XSL-FO

XPath

Аналогия

HTML +

CSS

XML +

XSLT~

Аналогия

HTML +

CSS

Selector

XML +

XSLT

XPath

~

Назначение

XML XML

XSLT

Назначение

XML HTML

XSLT

Сервер Браузер

Назначение

XML HTML

XSLT

Сервер Браузер

Declaration

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

Declaration

<?xmlversion="1.0"?><xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/XSL/Transform">...</xsl:stylesheet>

Рабочий пример<?xmlversion="1.0"?><page><sections><itemhref="politics">Политика</item><itemhref="world">Вмире</item><itemhref="economy">Экономика</item><itemhref="society">Общество</item></sections></page>

Рабочий пример<?xmlversion="1.0"?><page><sections><itemhref="politics"><name>Политика</name><itemhref="russia">ВРоссии</item><itemhref="foreign">Внешняя...</item><itemhref="senate">Совет...</item></item><itemhref="world">Вмире</item><itemhref="economy">Экономика</item><itemhref="society">Общество</item></sections></page>

Рабочий пример<?xmlversion="1.0"?><page><sections><itemhref="politics"><name>Политика</name><itemhref="russia"><name>ВРоссии</name></item><itemhref="foreign"><name>Внешняяполитика</name></item><itemhref="senate"><name>СоветФедерации</name></item></item>...</sections></page>

Рабочий пример. Вариант 1<?xmlversion="1.0"?><page><sections><itemhref="politics"name="Политика"><itemhref="russia"name="ВРоссии"/><itemhref="foreign"name="Внешняя..."/><itemhref="senate"name="Совет..."/></item><itemhref="world"name="Вмире"/><itemhref="economy"name="Экономика"/><itemhref="society"name="Общество"/></sections></page>

Ожидаемый результат<ul><li><ahref="/politics/">Политика</a><ul><li><ahref="/politics/russia/">ВРоссии</a></li><li><ahref="/politics/foreign/">Внешняя...</a></li><li><ahref="/politics/senate/">ВРоссии</a></li></ul></li><li><ahref="/world/">Вмире</a></li><li><ahref="/society/">Общество</a></li></ul>

XSLT<?xmlversion="1.0"encoding="UTF‐8"?><xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:outputencoding="UTF‐8"indent="yes"/>

</xsl:stylesheet>

XSLT<?xmlversion="1.0"encoding="UTF‐8"?><xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:outputencoding="UTF‐8"indent="yes"/>

<xsl:templatematch="/page"><div><xsl:for‐eachselect="sections/item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a></xsl:for‐each></div></xsl:template>

</xsl:stylesheet>

XSLT

<xsl:templatematch="/page"><div><xsl:for‐eachselect="sections/item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a></xsl:for‐each></div></xsl:template>

<xsl:templatematch="/page"><div><xsl:for‐eachselect="sections/item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a></xsl:for‐each></div></xsl:template>

XSLT и XPath

XPath

XML + XSLT

<xsl:templatematch="/page"><div><xsl:for‐eachselect="sections/item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a></xsl:for‐each></div></xsl:template>

<page><sections><itemhref="politics"name="Политика"><itemhref="russia"name="ВРоссии"/><itemhref="foreign"name="Внешняя..."/><itemhref="senate"name="Совет..."/></item><itemhref="world"name="Вмире"/><itemhref="economy"name="Экономика"/><itemhref="society"name="Общество"/></sections></page>

XML + XSLT

<xsl:templatematch="/page"><div><xsl:for‐eachselect="sections/item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a></xsl:for‐each></div></xsl:template>

<page><sections><itemhref="politics"name="Политика"><itemhref="russia"name="ВРоссии"/><itemhref="foreign"name="Внешняя..."/><itemhref="senate"name="Совет..."/></item><itemhref="world"name="Вмире"/><itemhref="economy"name="Экономика"/><itemhref="society"name="Общество"/></sections></page>

XML + XSLT

<xsl:templatematch="/page"><div><xsl:for‐eachselect="sections/item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a></xsl:for‐each></div></xsl:template>

<page><sections><itemhref="politics"name="Политика"><itemhref="russia"name="ВРоссии"/><itemhref="foreign"name="Внешняя..."/><itemhref="senate"name="Совет..."/></item><itemhref="world"name="Вмире"/><itemhref="economy"name="Экономика"/><itemhref="society"name="Общество"/></sections></page>

XML + XSLT

<xsl:templatematch="/page"><div><xsl:for‐eachselect="sections/item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a></xsl:for‐each></div></xsl:template>

<page><sections><itemhref="politics"name="Политика"><itemhref="russia"name="ВРоссии"/><itemhref="foreign"name="Внешняя..."/><itemhref="senate"name="Совет..."/></item><itemhref="world"name="Вмире"/><itemhref="economy"name="Экономика"/><itemhref="society"name="Общество"/></sections></page>

XML + XSLT

<xsl:templatematch="/page"><div><xsl:for‐eachselect="sections/item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a></xsl:for‐each></div></xsl:template>

<page><sections><itemhref="politics"name="Политика"><itemhref="russia"name="ВРоссии"/><itemhref="foreign"name="Внешняя..."/><itemhref="senate"name="Совет..."/></item><itemhref="world"name="Вмире"/><itemhref="economy"name="Экономика"/><itemhref="society"name="Общество"/></sections></page>

HTML

<?xmlversion="1.0"encoding="UTF‐8"?><div><ahref="politics">Политика</a><ahref="world">Вмире</a><ahref="economy">Экономика</a><ahref="society">Общество</a></div>

XML + XSLT

<xsl:templatematch="/page"><div><xsl:for‐eachselect="sections/item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a>?<xsl:for‐eachselect="item">?</xsl:for‐each></div></xsl:template>

<page><sections><itemhref="politics"name="Политика"><itemhref="russia"name="ВРоссии"/><itemhref="foreign"name="Внешняя..."/><itemhref="senate"name="Совет..."/></item><itemhref="world"name="Вмире"/><itemhref="economy"name="Экономика"/><itemhref="society"name="Общество"/></sections></page>

XSLT

<xsl:templatematch="/page"><div><xsl:apply‐templatesselect="sections/item"/></div></xsl:template>

<xsl:templatematch="item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a><xsl:iftest="item"><div><xsl:apply‐templatesselect="item"/></div></xsl:if></xsl:template>

<xsl:templatematch="/page"><div><xsl:apply‐templatesselect="sections/item"/></div></xsl:template>

<xsl:templatematch="item"><ahref="{@href}"><xsl:value‐ofselect="@name"/></a><xsl:iftest="item"><div><xsl:apply‐templatesselect="item"/></div></xsl:if></xsl:template>

XML + XSLT

XML + XSLT = HTML

<?xmlversion="1.0"encoding="UTF‐8"?><div><ahref="politics">Политика</a><div><ahref="russia">ВРоссии</a><ahref="foreign">Внешняяполитика</a><ahref="senate">СоветФедерации</a></div><ahref="world">Вмире</a><ahref="economy">Экономика</a><ahref="society">Общество</a></div>

XML + XSLT = HTML

<?xmlversion="1.0"encoding="UTF‐8"?><div><ahref="/politics/">Политика</a><div><ahref="/politics/russia/">ВРоссии</a><ahref="/politics/foreign/">Внешняяполитика</a><ahref="/politics/senate/">СоветФедерации</a></div><ahref="/world/">Вмире</a><ahref="/economy/">Экономика</a><ahref="/society/">Общество</a></div>

XSLT

<xsl:templatematch="item"><ahref="/{@href}/"><xsl:value‐ofselect="@name"/></a>...</xsl:template>

XSLT

<xsl:templatematch="item"><ahref="/{@href}/"><xsl:iftest="parent::item"><xsl:attributename="href"><xsl:text>/</xsl:text><xsl:value‐ofselect="../item/@href"/><xsl:text>/</xsl:text><xsl:value‐ofselect="@href"/><xsl:text>/</xsl:text></xsl:attribute></xsl:if><xsl:value‐ofselect="@name"/></a>...</xsl:template>

Рабочий пример. Вариант 2<?xmlversion="1.0"?><page><sections><itemhref="politics"name="Политика"/><itemhref="world"name="Вмире"/><itemhref="economy"name="Экономика"/><itemhref="society"name="Общество"/><itemhref="russia"name="ВРоссии"parent="politics"/><itemhref="foreign"name="Внешняя..."parent="politics"/><itemhref="senate"name="Совет..."parent="politics"/></sections></page>

Рабочий пример. Вариант 2<?xmlversion="1.0"?><page><sections><itemhref="politics"name="Политика"/><itemhref="world"name="Вмире"/><itemhref="economy"name="Экономика"/><itemhref="society"name="Общество"/><itemhref="russia"name="ВРоссии"parent="politics"/><itemhref="foreign"name="Внешняя..."parent="politics"/><itemhref="senate"name="Совет..."parent="politics"/></sections></page>

XSLT<xsl:templatematch="/page"><div><xsl:apply‐templatesselect="sections/item[not(@parent)]"/></div></xsl:template>

XSLT<xsl:templatematch="item"><ahref="/{@href}/"><xsl:iftest="@parent"><xsl:attributename="href"><xsl:text>/</xsl:text><xsl:value‐ofselect="@parent"/><xsl:text>/</xsl:text><xsl:value‐ofselect="@href"/><xsl:text>/</xsl:text></xsl:attribute></xsl:if><xsl:value‐ofselect="@name"/></a><xsl:iftest="../item[@parent=current()/@href]"><div><xsl:apply‐templatesselect="../item[@parent=current()/@href]"/></div></xsl:if></xsl:template>

XSLT<xsl:templatematch="item"><ahref="/{@parent}/{@href}/"><xsl:value‐ofselect="@name"/></a><xsl:iftest="../item[@parent=current()/@href]"><div><xsl:apply‐templatesselect="../item[@parent=current()/@href]"/></div></xsl:if></xsl:template>

Примеры XPath-выраженийa

*

a[1]

a[b]

a[@c]

/a

//a

a/b

a//b

.

..

./a

@c

./@c

@*

*|text()

a[last()]

a[position()=2]

a[position()=last()]

a[@title="xxx"]

a[count(b)=3]

a[@title=@title2andcount(b)!=0]

a[@title=@title2][count(b)!=0]

a/*[name()="unknown"]

a/*/b[@nameor@sirname]

../../../a[d]//b[not(@title)]/text()

tr[position()mod2=1]

Оси XPath (axis)self::b

parent::b

child::b

descendant::b

ancestor::b

descendant‐or‐self::b

ancestor‐or‐self::b

following‐sibling::b

preceding‐sibling::b

attribute::c

namespace::ns

Оси XPath (axis)self::b

parent::b

child::b

descendant::b

ancestor::b

descendant‐or‐self::b

ancestor‐or‐self::b

following‐sibling::b

preceding‐sibling::b

attribute::c

namespace::ns

.

../b

b

.//b

.//b|.

../*[position()<

current()/position()]

@c

Арифметические операции в XPath<xsl:value‐ofselect="3"/>

<xsl:value‐ofselect="1+2"/>

<xsl:value‐ofselect="@price+@tax"/>

<xsl:value‐ofselect="@salary*0.87"/>

<xsl:value‐ofselect="@visitorsdiv365"/>

<xsl:value‐ofselect="@daysmod7"/>

Строковые функции в XPathstring(123)

concat("alpha","beta")

concat(node/@attr,",",@value)

starts‐with(name(),"item")

ends‐width

contains(text(),"Tiananmen")

substring("20070102",5,2)

substring‐before("2007‐01‐02","‐");

substring‐after("Aug2007","");

string‐length(text())

Прочие функции в XPath<itemvalue="5"/>

<itemvalue="2.3”/>

<itemvalue="‐9.3"/>

<xsl:value‐ofselect="sum(item/@value)"/>

<xsl:value‐ofselect="number(text())"/>

<xsl:value‐ofselect="floor(@value)"/>

<xsl:value‐ofselect="ceiling(@value)"/>

<xsl:value‐ofselect="round(@value)"/>

<xsl:value‐ofselect="translate(text(),

‘abcdefghijklmnopqrstuvwxyz’,

‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’"

Элементы XSLT<xsl:importhref="another.xslt"/>

<xsl:includehref="more.xslt"/>

<xsl:output

method="html"|"xml"|"text"

encoding="KOI8‐R"

indent="yes"|"no"

/>

Элементы XSLT<xsl:importhref="another.xslt"/>

<xsl:includehref="more.xslt"/>

<xsl:output

method="html"|"xml"|"text"

encoding="KOI8‐R"

indent="yes"|"no"

/>

<xsl:templatematch="para">

</xsl:template>

<xsl:templatename="template‐name">

</xsl:template>

Последовательность обхода XSLT<xsl:templatematch="/">

</xsl:template>

<xsl:templatematch="/page">

</xsl:template>

<xsl:templatematch="/page/sections">

</xsl:template>

<xsl:templatename="sections/item">

</xsl:template>

<xsl:templatename="item">

</xsl:template>

<xsl:templatematch="item[item]"/>

Обработка узлов (создание дерева)<xsl:templatematch="/">

<html>

<head>

<xsl:apply‐templatesselect="css"/>

<xsl:apply‐templatesselect="js"/>

</head>

<body>

<xsl:apply‐templatesselect="content"/>

</body>

</html>

</xsl:template>

Обработка узлов<xsl:templatematch="/">

<html>

<head>

<xsl:apply‐templatesselect="css"/>

<xsl:apply‐templatesselect="js"/>

</head>

<body>

<xsl:apply‐templatesselect="content"/>

</body>

</html>

</xsl:template>

<xsl:templatematch="page">

<xsl:apply‐templatesselect="."/>

</xsl:template>

Обработка узлов<css>

<item>default.css</item>

<item>weather.css</item>

</css>

<xsl:apply‐templatesselect="css"/>

<xsl:templatematch="css">

<xsl:for‐eachselect="item">

<link

rel="stylesheet"

type="text/css"

href="text()"

/>

</xsl:for‐each>

</xsl:template>

Обработка узлов<js>

<item>default.js</item>

<item>gwt.js</item>

</js>

<xsl:apply‐templatesselect="js"/>

<xsl:templatematch="js">

<xsl:apply‐templatesselect="item"/>

</xsl:template>

<xsl:templatematch="js/item">

<scripttype="text/javascript"src="text()">

</script>

</xsl:template>

mode<xsl:templatematch="css"mode="header">

<xsl:for‐eachselect="item">

<linkrel="stylesheet"type="text/css"

href="{text()}"/>

</xsl:for‐each>

</xsl:template>

<xsl:templatematch="css"mode="debug">

<ul>

<xsl:for‐eachselect="item">

<li>

<xsl:value‐ofselect="text()"/>

</li>

</xsl:for‐each>

</ul>

</xsl:template>

mode<xsl:templatematch="/">

<html>

<head>

<xsl:apply‐templates

select="css"

mode="header"

/>

</head>

<body>

<xsl:apply‐templates

select="css"

mode="debug"

/>

</body>

</html>

</xsl:template>

Шаблон с именем<xsl:templatename="copywright">

<divid="Copywright">

<xsl:text>©</xsl:text>

<xsl:value‐ofselect="/page/manifest/date/@year”/>

</div>

</xsl:template>

<xsl:templatematch="/">

...

<body>

<xsl:apply‐templatesselect="content"/>

<xsl:call‐templatename="copywright"/>

</body>

...

</xsl:template>

Создание элементов<xsl:elementname="body">

<xsl:copy‐of

select="/page/content/*|/page/content/text()"/>

</xsl:element>

Создание элементов и аттрибутов<xsl:elementname="body">

<xsl:attributename="style">

<xsl:text>background:white</xsl:text>

</xsl:attribute>

<xsl:copy‐of

select="/page/content/*|/page/content/text()"/>

</xsl:element>

Создание элементов и аттрибутов<xsl:elementname="body">

<xsl:attributename="style">

<xsl:text>background:white</xsl:text>

</xsl:attribute>

<xsl:copy‐of

select="/page/content/*|/page/content/text()"/>

</xsl:element>

≈<bodystyle="background:white">

<xsl:apply‐templatesselect="/page/content"/>

</body>

Комментарии<!‐‐xmlcomment‐‐>

<xsl:textdisable‐output‐escaping="yes">

&lt;!‐‐strangecomment‐‐&gt;

</xsl:text>

<xsl:comment>

xsltcomment

</xsl:comment>

Нумерация<xsl:number

level="single"|"multiple"|"any"

from="sections"

count="item"

format="A"|"=1:2="

/>

Нумерация<xsl:templatematch="item">

<xsl:numberformat="multiple"/>

<ahref="{@href}">

<xsl:value‐ofselect="{text()}"/>

</a>

...

</xsl:template>

<div>

1<ahref="/politics/">Политика</a>

<div>

1.1<ahref="/russia/">ВРоссии</a>

1.2<ahref="/foreign/">Внешняяполитика</a>

1.3<ahref="/senate/">СоветФедерации</a>

</div>

...

Условия<xsl:iftest="@colour=‘white’">

<xsl:apply‐templates/>

</xsl:if>

Условия<xsl:iftest="@colour=‘white’">

<xsl:apply‐templates/>

</xsl:if>

<xsl:choose>

<xsl:whentest="@size<10">

...

</xsl:when>

<xsl:whentest="@size=10">

...

</xsl:when>

<xsl:otherwise>

...

</xsl:otherwise>

</xsl:choose>

Условия<xsl:iftest="@colour=‘white’">

<xsl:apply‐templates/>

</xsl:if>

<xsl:choose>

<xsl:whentest="@size<10">

...

</xsl:when>

<xsl:whentest="@size=10">

...

</xsl:when>

<xsl:otherwise>

...

</xsl:otherwise>

</xsl:choose>

Сортировка<xsl:sort

select="@href"

order="ascending"|"descending"

case‐order="upper‐first"|"lower‐first"

/>

<xsl:for‐eachselect="item">

<xsl:sortselect="text()"/>

<ahref="{@href}">

<xsl:value‐ofselect="text()"/>

</a>

</xsl:for‐each>

Переменные<xsl:variablename="year"select="2007"/>

<xsl:value‐ofselect="$year"/>

Переменные<xsl:variablename="year"select="2007"/>

<xsl:value‐ofselect="$year"/>

<xsl:variablename="copywright">

<p>

<xsl:value‐ofselect="$year"/>

</p>

<ul>

<xsl:for‐eachselect="authors/item">

<li>

<xsl:value‐ofselect="@name"/>

</li>

</xsl:for‐each>

</ul>

</xsl:variable>

Переменные<xsl:templatematch="item">

<xsl:paramname="class"/>

<divclass="$class">

...

</div>

</xsl:template>

<xsl:apply‐templatesselect="item">

<xsl:with‐paramname="class"select="’front’"/>

</xsl:apply‐templates>

Переменные<xsl:templatematch="item">

<xsl:paramname="class"/>

<divclass="$class">

...

</div>

</xsl:template>

<xsl:apply‐templatesselect="item">

<xsl:with‐paramname="class">front</xsl:with‐param>

</xsl:apply‐templates>

Переменные<xsl:variable

name="list"

select="document(‘site‐structure.xml’)"

/>

<xsl:templatename="site‐menu">

<xsl:for‐eachselect="$list/sections/item">

<ahref="{@href}">

<xsl:value‐ofselect="text()"/>

</a>

</xsl:for‐each>

</xsl:template>

Переменные<xsl:variable

name="list"

select="document(‘http://example.com/structure.xml’)"

/>

<xsl:templatename="site‐menu">

<xsl:for‐eachselect="$list/sections/item">

<ahref="{@href}">

<xsl:value‐ofselect="text()"/>

</a>

</xsl:for‐each>

</xsl:template>

Ключи<xsl:key

name="children"

match="/page/sections/item"

use="@parent"/>

<xsl:templatematch="/page/sections">

<xsl:for‐eachselect="item[not(@parent)]">

<ahref="{@href}">

<xsl:value‐ofselect="@name"/>

</a>

<xsl:for‐eachselect="key('children',@href)">

<xsl:value‐ofselect="@name"/>

<xsl:iftest="position()!=last()">,</xsl:if>

</xsl:for‐each>

</xsl:for‐each>

</xsl:template>

Часть 2