31
XPath, XSLT, (and XSL:FO) Zaawansowane Aplikacje Internetowe Dawid Weiss

XPath, XSLT, (and XSL:FO)

  • Upload
    lovie

  • View
    85

  • Download
    1

Embed Size (px)

DESCRIPTION

XPath, XSLT, (and XSL:FO). Dawid Weiss. Zaawansowane Aplikacje Internetowe. Wykład. XPath – „adresy” do elementów XML Czemu służy XPath? Ścieżki (ang. access paths) Osie (ang. a xes ) Warunki (ang. n ode tests ) Predykaty (ang. p redicates ) Wyrażenia (ang. e xpressions ) - PowerPoint PPT Presentation

Citation preview

Page 1: XPath, XSLT,  (and XSL:FO)

XPath, XSLT, (and XSL:FO)

Zaawansowane Aplikacje Internetowe

Dawid Weiss

Page 2: XPath, XSLT,  (and XSL:FO)

Wykład● XPath – „adresy” do elementów XML

• Czemu służy XPath?• Ścieżki (ang. access paths)• Osie (ang. axes)• Warunki (ang. node tests)• Predykaty (ang. predicates)• Wyrażenia (ang. expressions)

● XSLT – transformacje plików XML● XSL:FO – prawdziwy raj dla smakoszy

Page 3: XPath, XSLT,  (and XSL:FO)

Czemu służy XPath?● Gdy XML zyskał popularność, powstały technologie

pochodne, potrzebny był jednoznaczny opis adresu elementu w pliku XML

● XPath przypomina ścieżki w systemie plików, z paroma dodatkowymi elementami– Może adresować więcej niż jeden element– Posiada warunki– Posiada wyrażenia

Page 4: XPath, XSLT,  (and XSL:FO)

Xpath – XML jako drzewo● XPath traktuje XML jako drzewo elementów● Każdy z „liści” może być:

• tagiem, atrybutem, instrukcją sterującą, komentarzem, tekstem, elementem namespace

• Liście są ze sobą powiązane „gałęziami”, które nazywamy osiami

Page 5: XPath, XSLT,  (and XSL:FO)

Przykład reprezentacji w postaci drzewa<?xml version="1.0" ?><topics> <politics> <leaders> <person id="shussein" country="iraq"> <name>Saddam</name></person> <person id="gbush" country="us"> <name>George</name></person> </leaders> </politics> <movies> <directors> <person id="pgreeneway"> <name>Peter</name></person> <person id="slee"> <name>Spike</name></person> </directors> <movie director="pgreeneway" rank="great">Prospero's books</movie> <movie>Ghost Dog</movie> </movies></topics>

Page 6: XPath, XSLT,  (and XSL:FO)

Proste ścieżki dostępu<?xml version="1.0" ?><topics> <politics> <leaders> <person id="shussein"

country="iraq"><name>Saddam</name></person>

<person id="gbush" country="us">

<name>George</name></person> </leaders> </politics> <movies> <directors> <person id="pgreeneway">

<name>Peter</name></person> <person id="slee">

<name>Spike</name></person> </directors> <movie director="pgreeneway"

rank="great">Prospero's books</movie> <movie>Ghost Dog</movie> </movies></topics>

/topics/politics/leaders/person

/topics/movies/directors

/topics/movies/movie/@director

/topics/movies/movie/text()

Page 7: XPath, XSLT,  (and XSL:FO)

Nazwy ścieżek dostępu (osi)● Parent::• Child::• Ancestor::• Ancestor-or-self::• Descendant::• Descendant-or-self::• Preceding::• Preceding-sibling::• Following::• Following-sibling::

• Self::• Attribute::• Namespace::

Page 8: XPath, XSLT,  (and XSL:FO)

Ścieżki dostępu, c.d.<?xml version="1.0" ?><topics> <politics> <leaders> <person id="shussein"

country="iraq"><name>Saddam</name></person>

<person id="gbush" country="us">

<name>George</name></person> </leaders> </politics> <movies> <directors> <person id="pgreeneway">

<name>Peter</name></person> <person id="slee">

<name>Spike</name></person> </directors> <movie director="pgreeneway"

rank="great">Prospero's books</movie> <movie>Ghost Dog</movie> </movies></topics>

//person/ancestor::leaders/person

//leaders/person

Page 9: XPath, XSLT,  (and XSL:FO)

Predykaty● Predykaty umożliwiają funkcjonalne

wyeliminowanie niektórych węzłów– /path[predicate]● Predykaty mogą zawierać funkcje i operatory

● Tylko węzły dla których predykat jest prawdziwy zostają włączone do wyniku

Page 10: XPath, XSLT,  (and XSL:FO)

Operatory

Page 11: XPath, XSLT,  (and XSL:FO)

Funkcje

Page 12: XPath, XSLT,  (and XSL:FO)

Funkcje i predykaty w praktyce<?xml version="1.0" ?><topics> <politics> <leaders> <person id="shussein"

country="iraq"><name>Saddam</name></person>

<person id="gbush" country="us">

<name>George</name></person> </leaders> </politics> <movies> <directors> <person id="pgreeneway">

<name>Peter</name></person> <person id="slee">

<name>Spike</name></person> </directors> <movie director="pgreeneway"

rank="great">Prospero's books</movie> <movie>Ghost Dog</movie> </movies></topics>

//person[position() = 1]

Page 13: XPath, XSLT,  (and XSL:FO)

XPath – za i przeciw• Czy łatwo się nauczyć XPath?

● Tak, choć czasem nie jest łatwo…

• Czy XPath jest użyteczny?● Jak najbardziej, ma wiele zastosowań, ale głównie używany jest

w XSLT

count(//document[@id = current()/@refid]/preceding::document)+1

Page 14: XPath, XSLT,  (and XSL:FO)

XSLT● XSLT = Extensible Stylesheet Language

Transformations• Regułowy język przetwarzania dokumentów XML w inne

dokumenty XML (lub w dokumenty tekstowe)• Język sam jest zapisany oczywiście w… XML!• Używa języka XPath do adresowania elementów pliku

źródłowego● Podsumowując: XSLT jest językiem programowania

Page 15: XPath, XSLT,  (and XSL:FO)

Prosty plik XSLT i reguły<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

version="1.0">

<xsl:template match="/"> This template lists all persons: <xsl:apply-templates select="//person" /> </xsl:template> <xsl:template match="person"> Person (id=<xsl:value-of select="@id" />): <xsl:value-of select="name" /> </xsl:template> <xsl:template match="*" /> </xsl:stylesheet>

Page 16: XPath, XSLT,  (and XSL:FO)

Przetwarzanie w XSLT● Zawsze zaczyna się w tagu głównym (ang. root

node) – '/'● Pasujące reguły są dopasowywane i uruchamiane● Zmienia się węzeł kontekstu (ang. context node) w

zależności od odpalonych reguł● Procedura jest powtarzana rekurencyjnie dla nowych

węzłów kontekstowych

Page 17: XPath, XSLT,  (and XSL:FO)

XSLT – przetwarzanie<?xml version="1.0" ?><topics> <politics> <leaders> <person id="shussein" country="iraq"> <name>Saddam</name></person> <person id="gbush" country="us"> <name>George</name></person> </leaders> </politics> <movies> <directors> <person id="pgreeneway"> <name>Peter</name></person> <person id="slee"> <name>Spike</name></person> </directors> <movie director="pgreeneway" rank="great">Prospero's books</movie> <movie>Ghost Dog</movie> </movies></topics>

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

<xsl:template match="/"> This template lists all persons: <xsl:apply-templates select="//person" /> </xsl:template> <xsl:template match="person">Person (id=<xsl:value-of select="@id" />): <xsl:value-of select="name" /> </xsl:template> <xsl:template match="*" /> </xsl:stylesheet>

Page 18: XPath, XSLT,  (and XSL:FO)

Ale po co jest XSLT?!● Aby zmienić strukturę pliku XML!

Page 19: XPath, XSLT,  (and XSL:FO)

<?xml version="1.0" ?><people> <person> <name>Dawid</name> <dept>Computer Science</dept> <dept>Agriculture</dept> </person>

<person> <name>Krzysztof</name> <dept>Spacecrafting</dept> <dept>Computer Science</dept> </person>

<person> <name>Boguś</name> <dept>Hyperactive Forestry</dept> </person></people>

<?xml version="1.0" encoding="Cp852"?><departments> <department name="Computer Science"> <person> <name>Dawid</name> </person> <person> <name>Krzysztof</name> </person> </department> <department name="Agriculture"> <person> <name>Dawid</name> </person> </department> <department name="Spacecrafting"> <person> <name>Krzysztof</name> </person> </department> <department name="Hyperactive Forestry"> <person> <name>Boguś</name> </person> </department></departments>

Page 20: XPath, XSLT,  (and XSL:FO)

<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:output encoding="Cp852" method="xml" indent="yes" /> <xsl:template match="/"> <departments> <xsl:apply-templates select="//dept" /> </departments> </xsl:template>

<xsl:template match="dept"> <xsl:if test="count(.//preceding::dept[./text() = current()/text()]) = 0"> <department> <xsl:attribute name="name"> <xsl:value-of select="./text()" /> </xsl:attribute> <xsl:variable name="currentDept" select="./text()" /> <xsl:for-each select="//person[./dept/text() = $currentDept]"> <person> <name><xsl:value-of select="name" /></name> </person> </xsl:for-each> </department> </xsl:if> </xsl:template> </xsl:stylesheet>

Tags not from 'xsl' namespaceare copied directly to the output

Why is this statement here?

xsl:attribute adds an attribute tothe enclosing tag

Page 21: XPath, XSLT,  (and XSL:FO)

Zad. domowe!● Napisz arkusz XSLT, który wykona transformację

odwrotną!<?xml version="1.0" ?><people> <person> <name>Dawid</name> <dept>Computer Science</dept> <dept>Agriculture</dept> </person>

<person> <name>Krzysztof</name> <dept>Spacecrafting</dept> <dept>Computer Science</dept> </person>

<person> <name>Boguś</name> <dept>Hyperactive Forestry</dept> </person></people>

<?xml version="1.0" encoding="Cp852"?><departments> <department name="Computer Science"> <person> <name>Dawid</name> </person> <person> <name>Krzysztof</name> </person> </department> <department name="Agriculture"> <person> <name>Dawid</name> </person> </department> <department name="Spacecrafting"> <person> <name>Krzysztof</name> </person> </department> <department name="Hyperactive Forestry"> <person> <name>Boguś</name> </person> </department></departments>

Page 22: XPath, XSLT,  (and XSL:FO)

Tylko po to jest ten XSLT?● XSLT jest również językiem zapytań do plików

XML, podobnie jak SQL jest językiem zapytań do baz danych● XQuery….

<xsl:template match="/"> <PeopleFromComputerScienceInstitute> <xsl:copy-of

select="//person[./dept/text() = 'Computer Science']/name" /> </PeopleFromComputerScienceInstitute> </xsl:template>

<PeopleFromComputerScienceInstitute> <name>Dawid</name> <name>Krzysztof</name></PeopleFromComputerScienceInstitute>

Page 23: XPath, XSLT,  (and XSL:FO)

Tylko po to jest ten XSLT?● Język, który umożliwia konwersję z XML do

HTML!– Umożliwia skupienie się na treści strony, a nie jej

wyglądzie

Page 24: XPath, XSLT,  (and XSL:FO)

Example of XML – HTML conversion

Page 25: XPath, XSLT,  (and XSL:FO)
Page 26: XPath, XSLT,  (and XSL:FO)
Page 27: XPath, XSLT,  (and XSL:FO)

<xsl:template match="download"><xsl:if test="not(@lng) or $lang=@lng"> <table class="download"> <xsl:attribute name="style"> <xsl:choose> <xsl:when test="@float='right'">float: right; margin-right: 0em; clear: both;</xsl:when> <xsl:when test="@float='inline'">display: inline;</xsl:when> <xsl:otherwise>float: left; margin-left: 0em; clear: both;</xsl:otherwise> </xsl:choose> </xsl:attribute> <tr> <td class="pic" align="center" valign="middle" rowspan="2"> <img> <xsl:attribute name="src"> <xsl:call-template name="rewriteImgURL"> <xsl:with-param name="href" select="concat('/gfx/icons/',substring(@src,stringength(@src)-2),'.gif')" /> </xsl:call-template> </xsl:attribute> </img> </td> <td class="link" align="left" valign="top"> <a> <xsl:attribute name="href"> <xsl:call-template name="rewriteURL"> <xsl:with-param name="href" select="@src" /> </xsl:call-template> </xsl:attribute> <xsl:apply-templates /> </a>

</td> </tr> <tr> <td class="desc" align="left" valign="top"> Download file </td> </tr> </table></xsl:if></xsl:template>

Page 28: XPath, XSLT,  (and XSL:FO)

Za i przeciw XSLT● XSLT jest bardzo wszechstronnym językiem● Styl programowania deklaratywnego nie jest dla

każdego…● Łatwo osiągnąć separację treści od prezentacji

(XML->HTML)!● XSLT nie jest najszybszy…● XSLT nie jest przystosowany do produkowania

formatów binarnych (PDF)

Page 29: XPath, XSLT,  (and XSL:FO)

XSL:FO – język opisu graficznego● XSL:FO opisuje w postaci pliku XML graficzny

rozkład elementów strony na pewnym nośniku (papier, WWW…)

● Procesory XSL:FO mogą produkować pliki PDF, PS i inne● Apache FOP● RenderX XEP

● XSL:FO jest dość skomplikowany, ale dzięki XSLT można osiągnąć separację treści od formatowania (format DocBook tak działa!)

Page 30: XPath, XSLT,  (and XSL:FO)

Przykład pliku XSL:FO file<?xml version="1.0" encoding="UTF-8"?><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>

Page 31: XPath, XSLT,  (and XSL:FO)

Dziękuję

● NA ZAJĘCIA PROSZĘ SIĘ PRZYGOTOWAĆ!

● ZADANIA DOMOWE MUSZĄ BYĆ ODROBIONE!