XML i nowoczesne technologie zarządzania treścią
Transkrypt
XML i nowoczesne technologie zarządzania treścią
XSLT – część 2 Rodzaje przetwarzania XSLT (1) • Przetwarzanie sterowane strukturą dokumentu źródłowego (ang. push): – przechodzimy po strukturze dokumentu źródłowego, – generujemy fragmenty struktury dokumentu wyjściowego. <xsl:template match="..."> ... <xsl:apply-templates/> ... </xsl:template> 2006-11-23 XSLT – część 2 2 Rodzaje przetwarzania XSLT (2) • Przetwarzanie sterowane strukturą dokumentu wyjściowego (ang. pull): – jedna duża reguła dla węzła root, – generujemy strukturę dokumentu docelowego, – wyciągamy odpowiednie wartości z dokumentu źródłowego. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict"> <xsl:template match="/"> <html><head><title>Expense Report Summary</title></head> <body> <h1>Company: <xsl:value-of select="company/name"/></h1> <p>Total Amount: <xsl:value-of select="expense-report/total"/></p> </body> </html> </xsl:template> </xsl:stylesheet> 2006-11-23 XSLT – część 2 3 Uproszczone przekształcenia • Tylko jeden wzorzec dla węzła root. • Pomijamy element stylesheet. <html xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict" xsl:version="1.0"> <head><title>Expense Report Summary</title></head> <body> <h1>Company: <xsl:value-of select="company/name"/></h1> <p>Total Amount: <xsl:value-of select="expense-report/total"/></p> </body> </html> 2006-11-23 XSLT – część 2 4 Zaawansowane możliwości XSLT • Sortowanie węzłów. • Tryby przetwarzania (modes): – przełączanie między trybami, – niezależnie definiowane wzorce dla każdego trybu. • Zmienne. • Wzorce nazwane: – wywoływane jak podprogramy (procedury), – przekazywanie parametrów, – rekursja. 2006-11-23 XSLT – część 2 5 Sortowanie • Można stosować w: – apply-templates, – for-each. <xsl:template match="miasta"> <h1>Miasta wg liczby mieszkańców</h1> <xsl:apply-templates select="miasto"> <xsl:sort select="liczba-mieszk" order="descending"/> </xsl:apply-templates> </xsl:template> 2006-11-23 XSLT – część 2 6 Tryby przetwarzania (modes) <xsl:template match="/"> <h1><xsl:value-of select="book/title"/></h1> <h2>Spis treści</h2> <xsl:apply-templates mode="toc"/> <xsl:apply-templates/> </xsl:template> <xsl:template match="chapter" mode="toc"> <p><a href="#{generate-id()}"> <xsl:value-of select="title"/></a></p> </xsl:template> <xsl:template match="chapter"> <h2><a name="{generate-id()}"> <xsl:value-of select="title"/></a></h2> <xsl:apply-templates/> </xsl:template> 2006-11-23 XSLT – część 2 7 Zmienne • Jak w funkcyjnych językach programowania: – brak instrukcji przypisania, – brak efektów ubocznych. • Deklaracja: – <xsl:variable name="..."/> – wartość: • atrybut select • zawartość elementu wyrażenie odpowiedniego typu, fragment drzewa wynikowego, • Użycie: – w wyrażeniach: $name, – <xsl:copy-of select="expression"/> 2006-11-23 XSLT – część 2 8 Wykorzystanie rekursji w XSLT (1) • Sposób na brak „prawdziwych” zmiennych i pętli iteracyjnych. • Przykład – suma wartości książek: <books> <book> <title>Pan Tadeusz</title> <qty>12</qty><price>10.99</price> </book> <book> <title>Mistrz i Małgorzata</title> <qty>1</qty><price>15.99</price> </book> <book> <title>Imię Róży</title> <qty>2</qty><price>6.99</price> </book> </books> 2006-11-23 XSLT – część 2 9 Wykorzystanie rekursji w XSLT (2) • Przykład – XSLT: <xsl:template name="total-val"> <xsl:param name="list"/> <xsl:choose> <xsl:when test="$list"> <xsl:variable name="first" select="$list[1] "/> <xsl:variable name="rest"> <xsl:call-template name="total-val"> <xsl:with-param name="list" select="$list[position()!=1] "/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$first/qty * $first/price + $rest"/> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:template> 2006-11-23 XSLT – część 2 10 Wykorzystanie rekursji w XSLT (3) • Przykład – XSLT, c.d.: <xsl:template match="/"> <xsl:variable name="total"> <xsl:call-template name="total-val"> <xsl:with-param name="list" select="//book"/> </xsl:call-template> </xsl:variable> <p>Total sales: <xsl:value-of select="$total"/> </p> </xsl:template> 2006-11-23 XSLT – część 2 11 Ograniczona użyteczność zmiennych • Specjalny typ danych: fragment drzewa wynikowego (result tree fragment): – wartość można jedynie: • skopiować do drzewa wynikowego lub innej zmiennej, • przekształcić do napisu; – nie można (w czystym XSLT) przekształcić na node set, – praktycznie niemożliwe obliczenia na zmiennych w kilku przebiegach. • Zmienna typu node set: <xsl:variable name="b" select="/books"/> <xsl:for-each select="$b/book">...</xsl:for-each> • Zmienna typu result tree fragment: <xsl:variable name="subtotals"> <xsl:for-each select="/books/book"> <subtl><xsl:value-of select="qty * price"/></subtl> </xsl:for-each> </xsl:variable> 2006-11-23 XSLT – część 2 12 Funkcja node-set() • Przekształca fragment drzewa wynikowego (result tree fragment) w zbiór węzłów (node set). • Niedostępna w „czystym” XSLT: • Dostępna jako rozszerzenie m. in. w: – procesorach: XT, Saxon, MSXML, – bibliotece rozszerzeń EXSLT. <xsl:variable name="subtotals"> <xsl:for-each select="/books/book"> <subtl><xsl:value-of select="qty * price"/></subtl> </xsl:for-each> </xsl:variable> <xsl:value-of select="sum(exsl:node-set($subtotals)/subtl)"/> 2006-11-23 XSLT – część 2 13 Generowanie przekształceń XSL (1) • Problem: – źródło przekształcenia nie zawiera metainformacji o strukturze dokumentu, – metainformacje pojawiają się na wyjściu. <wniosek-urlopowy> <wniosek> <pracownik>Szymon Zioło</pracownik> <rodzaj>wypoczynkowy</rodzaj> <od>2003-06-20</od> <do>2003-06-27</do> <dni-roboczych>6</dni-roboczych> </wniosek> <decyzja> <zgoda>1</zgoda> <zastępca>Jan Kowalski</zastępca> </decyzja> </wniosek-urlopowy> Źródło: Zioło, Sz., XSLT do kwadratu, Software 2.0, nr 6/2003 2006-11-23 XSLT – część 2 14 Generowanie przekształceń XSL (2) • Rozwiązanie: – zapisanie metainformacji w szablonie, – generowanie przekształcenia z szablonu. <dokument nazwa="wniosek-urlopowy" etykieta="Wniosek urlopowy"> <sekcja nazwa="wniosek" etykieta="Wniosek"> <pole nazwa="pracownik" etykieta="Pracownik:"/> <pole nazwa="rodzaj" etykieta="Rodzaj urlopu:"/> <pole nazwa="od" etykieta="Od dnia:"/> <pole nazwa="do" etykieta="Do dnia:"/> <pole nazwa="dni-roboczych" etykieta="Ilość dni roboczych:"/> </sekcja> <sekcja nazwa="decyzja" etykieta="Decyzja przełożonego"> <pole nazwa="zgoda" etykieta="Zgoda przełożonego:" typ="boolean"/> <pole nazwa="zastępca" etykieta="Zastępca:"/> </sekcja> </dokument> 2006-11-23 XSLT – część 2 15 Generator – przykład (1) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:res="http://www.w3.org/1999/XSL/TransformAlias"> <xsl:namespace-alias stylesheet-prefix="res" result-prefix="xsl"/> <xsl:template match="/"> <res:stylesheet version="1.0"> <res:output method="html"/> <xsl:apply-templates/> </res:stylesheet> </xsl:template> <xsl:template match="sekcja"> <res:template match="{@nazwa}"> <p><b><xsl:value-of select="@etykieta"/></b></p> <table><res:apply-templates/></table> </res:template> <xsl:apply-templates/> </xsl:template> 2006-11-23 XSLT – część 2 16 Generator – przykład (2) <xsl:template match="pole"> <res:template match="{@nazwa}"> <tr><td><xsl:value-of select="@etykieta"/></td> <td><b> <xsl:choose> <xsl:when test="@typ='boolean'"> <res:choose> <res:when test="text()='1'">tak</res:when> <res:otherwise>nie</res:otherwise> </res:choose> </xsl:when> <xsl:otherwise> <res:value-of select="text()"/> </xsl:otherwise> </xsl:choose> </b></td></tr> </res:template> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet> 2006-11-23 XSLT – część 2 17 Zastosowanie w projekcie: KEDU ZUS KEDU RCB RCB DRSB wycięcie dokumentu wycięcie formularza RCB Blok powtarzalny ZEUB RSB Generator arkuszy stylów Szablon 2006-11-23 XSLT – część 2 Arkusz stylów Wizualizacja HTML 18 KEDU ZUS – przykład wizualizacji 2006-11-23 XSLT – część 2 19 Formatting Objects – przykład drzewa wynikowego <?xml version="1.0" encoding="utf-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> ... <fo:page-sequence> <fo:flow> <fo:block font-size="18pt" font-weight="bold" text-align="centered">Preface</fo:block> <fo:block font-size="12pt" space-before="1pc" text-align="justified"> This is a simple test document. It shows a <fo:inline font-style="italic">partial</fo:inline> fo-result tree (page layout missing).</fo:block> </fo:flow> </fo:page-sequence> ... </fo:root> 2006-11-23 XSLT – część 2 20 Formatting Objects – przykłady reguł <xsl:template match="chapter"> <fo:flow><xsl:apply-templates/></fo:flow> </xsl:template> <xsl:template match="chapter/title"> <fo:block font-size="18pt" font-weight="bold" text-align="centered"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="para"> <fo:block font-size="12pt" space-before="1pc" text-align="justified"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="emphasis"> <fo:inline font-style="italic"><xsl:apply-templates/> </fo:inline> </xsl:template> 2006-11-23 XSLT – część 2 21 Narzędzia • Procesory XSLT: – – – – – – – XT, James Clark (Java), Oracle XML Parser for Java / C / PL-SQL, Xalan, Apache (Java, C++), SAXON, Michael H. Kay (Java; implementuje XSLT 2.0 i XQuery), Sablotron (C++, open source), Microsoft XML Core Services (MSXML 4.0), XSLTC (XSLT compiler, Java), Apache. • Procesor XSL:FO: – FOP, Apache (Java; generuje dokumenty w formacie PDF). • Edytory XSLT: – XMLSPY, Altova – Xselerator XSL Editor/Debugger, MarrowSoft, – xslide – Emacs Major Mode for XSL Stylesheets. 2006-11-23 XSLT – część 2 22 Najważniejsze ograniczenia XSLT 1.0 • Brak konwersji fragmentów drzewa wynikowego na pełnoprawne zbiory węzłów. • Brak możliwości generowania wielu dokumentów wyjściowych. • Brak wsparcia dla grupowania węzłów. • Brak możliwości definiowania własnych funkcji. 2006-11-23 XSLT – część 2 23 Gdzie szukać dalej • EXSLT www.exslt.org/ • Kosek, J., Understanding the node-set() Function www.xml.com/pub/a/2003/07/16/nodeset.html • Tyszko, S., Rekurencyjne szablony w XSLT Software 2.0, nr 6/2002, Wydawnictwo Software • Zioło, Sz., XSLT do kwadratu Software 2.0, nr 6/2003, Wydawnictwo Software 2006-11-23 XSLT – część 2 24