1 / 31

XPath, XSLT, (and XSL:FO)

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 )

lovie
Download Presentation

XPath, XSLT, (and XSL:FO)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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

  3. 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

  4. 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

  5. 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'sbooks</movie> <movie>Ghost Dog</movie> </movies> </topics>

  6. 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()

  7. 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::

  8. Ś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

  9. 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

  10. Operatory

  11. Funkcje

  12. 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]

  13. 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

  14. 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

  15. 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>

  16. 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

  17. 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>

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

  19. <?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> <?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>

  20. <?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>

  21. Zad. domowe! Napisz arkusz XSLT, który wykona transformację odwrotną! <?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> <?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>

  22. 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>

  23. 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

  24. Example of XML – HTML conversion

  25. <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>

  26. 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)

  27. 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!)

  28. 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>

  29. Dziękuję NA ZAJĘCIA PROSZĘ SIĘ PRZYGOTOWAĆ! ZADANIA DOMOWE MUSZĄ BYĆ ODROBIONE!

More Related