XML eXtensible Markup Language 3 -...

Post on 28-Feb-2019

232 views 0 download

Transcript of XML eXtensible Markup Language 3 -...

XML – eXtensible Markup Language 3

XSL transformations (XSLT)

XSLT (ang. eXtensible Stylesheet Language Transformations) jest opartym na XML językiem transformacji dokumentów XML

XSLT umożliwia przetłumaczenie dokumentów z jednego formatu XML na inny format XML, ale również na HTML, PDF i inne.

dokument XML

arkusz XSLT

plik wyjściowy

(XML, HTML, PDF etc.)

procesor XSLT

Arkusze XSLT określają w jaki sposób przekształcić poszczególne elementy wejściowe pliku XML.

XSLT i przeglądarki

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

INSTRUKCJE OKREŚLAJĄCE PRZEKSZTAŁCENIA ELEMENTÓW

</xsl:stylesheet>

Struktura XSLT

Arkusz XSLT ma następującą strukturę

W dokumencie XML, który ma być przekształcamy umieszczamy

<?xml-stylesheet type="application/xml" href="people.xsl"?>

Zapisujemy go w pliku z rozszerzeniem xsl np. people.xsl.

<?xml version="1.0"?>

<?xml-stylesheet type="application/xml" href="people.xsl"?>

<people>

<person born="1912" died="1954">

<name>

<first_name>Alan</first_name>

<last_name>Turing</last_name>

</name>

<profession>computer scientist</profession>

<profession>mathematician</profession>

<profession>cryptographer</profession>

</person>

<person born="1918" died="1988">

<name>

<first_name>Richard</first_name>

<last_name>Feynman</last_name>

</name>

<profession>physicist</profession>

</person>

</people>

Dołączenie XSLT

Rozważmy następujący dokument XML

xsl:template

Przykład 1

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</xsl:stylesheet>

Wynik:

AlanTuringcomputer scientistmathematiciancryptographerRichardFeynmanphysicist

Jeżeli chcemy dokonać transformacji wybranego elementu z dokumentu XML musimy się do niego odwołać w arkuszu XSL:

<xsl:template match="element">

</xsl:template>

Przykład 2

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="person">A Person</xsl:template>

</xsl:stylesheet>

Wynik:

A PersonA Person

W dokumencie wejściowym są dwa elementy person.

Procesor napotykając te elementy zamienia je na A Person.

xsl:template

Przykład 3

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="person"><p>A Person</p></xsl:template>

</xsl:stylesheet>

Wynik A Person A Person

W dokumencie wejściowym są dwa elementy person.

Procesor napotykając te elementy zamienia je na A Person umieszczone w oddzielnych akapitach.

xsl:template

XSLT

Przykład 4

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="person"><p>A Person</xsl:template>

</xsl:stylesheet>

Arkusz XSLT musi być (jako dokument XML) poprawny składniowo (ang. well formed).

Poniższy arkusz XML nie jest poprawny składniowo.

Musi zatem spełniać wszystkie wymagania związane z poprawnością składniową.

xsl:value-of

Jeżeli chcemy wybrać z wejściowego dokumentu XML pewien element w arkuszu XSLT stosujemy element:

<xsl:value-of select="element"/>

Przykład 5

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="person">

<xsl:value-of select="name"/>

</xsl:template>

</xsl:stylesheet>

Wynik

Alan Turing

Richard Feynman

Procesor napotykając elementy person pobiera z nich wartości elementów name i umieszcza w oddzielnych akapitach.

Procesor XSLT przechodzi przez elementy dokumentu XML metodą PREORDER.

Atrybutem match elementu template są węzły przetwarzanego

dokumentu XML.

Z wyselekcjonowanych w ten sposób węzłów już można pobrać (i wstawić do wyniku) dane, można je także skierować do dalszego przetwarzania, poprzez umieszczenie dyrektywy xsl:apply-templates.

xsl:apply-templates

Przykład 6

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="name">

<xsl:value-of select="last_name"/>

<xsl:value-of select="first_name"/>

</xsl:template>

</xsl:stylesheet>

W poniższym przykładzie wybieramy wartości elementów last_name i first_name będących dziećmi elementu name.

Zauważmy, że procesor najpierw przetwarza nazwisko a później imię.

xsl:value-of

Wynik:

TuringAlancomputer scientistmathematiciancryptographer FeynmanRichardphysicist

Modyfikacja:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="name">

</xsl:template>

</xsl:stylesheet>

xsl:value-of

Wynik:

computer scientist mathematician cryptographer physicist

xsl:value-of

Jeżeli chcemy aby w dokumencie wynikowym były tylko wartości elementów last_name i first_name musimy wyraźnie to zapisać…

…tzn. musimy zapisać, że procesor ma przetwarzać element name.

Przykład 7

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="name">

<xsl:value-of select="last_name"/>

<xsl:value-of select="first_name"/>

</xsl:template>

<xsl:template match="person">

<xsl:apply-templates select="name"/>

</xsl:template>

</xsl:stylesheet>

W tym miejscu rozpoczyna się przetwarzanie elementu name.

Procesor zaczyna szukać elementu template z wartością match="name".

xsl:apply-templates

XSLT

Wynik:

TuringAlan FeynmanRichard

Kolejność elementów w arkuszu XSLT nie ma znaczenia.

Ważna jest tylko kolejność elementów w dokumencie XML.

Załóżmy teraz, że chcemy zawartość elementu people umieścić w

dokumencie HTML o tytule Famous Scientists.

Musimy zatem w odpowiednim miejscu umieścić instrukcję przetwarzania dzieci korzenia (people)

<?xml version="1.0"?>

<?xml-stylesheet type="application/xml" href="people.xsl"?>

<people>

<person born="1912" died="1954">

<name>

<first_name>Alan</first_name>

<last_name>Turing</last_name>

</name>

<profession>computer scientist</profession>

<profession>mathematician</profession>

<profession>cryptographer</profession>

</person>

<person born="1918" died="1988">

<name>

<first_name>Richard</first_name>

<last_name>Feynman</last_name>

</name>

<profession>physicist</profession>

</person>

</people>

XSLT

Rozważamy następujący dokument XML:

XSLT

Przykład 8

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="people">

<html>

<head>

<title>Famous Scientists</title>

</head>

<body>

<xsl:apply-templates select="person"/>

</body>

</html>

</xsl:template>

XSLT

<xsl:template match="name">

<p>

<xsl:value-of select="last_name"/>

<xsl:value-of select="first_name"/>

</p>

</xsl:template>

<xsl:template match="person">

<xsl:apply-templates select="name"/>

</xsl:template>

</xsl:stylesheet>

Przykład 8 cd

XSLT - atrybuty

W arkuszach XSLT możemy transformować nie tylko wartości elementów.

Możliwe jest także odwoływanie się do atrybutów.

Wykorzystujemy w tym celu element:

<xsl:template match="@nazwa_atrybutu">

</xsl:template>

Jeżeli chcemy odwołać się do wszystkich atrybutów jako nazwe_atrybutu podajemy *:

<xsl:template match="@*">

</xsl:template>

Przykład 9

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="person">

<p>

<xsl:apply-templates select="name"/>

<br/>Born: <xsl:apply-templates select="@born"/>

</p>

</xsl:template>

</xsl:stylesheet>

Element

<xsl:apply-templates select="@born"/>

„zwraca” wartość atrybutu born.

XSLT - atrybuty

XSLT

Wynik:

AlanTuring Born: 1912

RichardFeynman

Born: 1918

Jeżeli chcemy odwołać się do dowolnego elementu w dokumencie XML w arkuszu XSLT stosujemy element

<xsl:template match="*|/">

<xsl:apply-templates/>

</xsl:template>

* - dowolny element, / - korzeń, | - alternatywa.

Powyższy element spowoduje, że procesor dotrze do wszystkich elementów i korzenia z wyjątkiem atrybutów i elementów z przestrzeni nazw które nie są dziećmi swoich rodziców.

XSLT – przestrzenie nazw

Dodajmy do rozważanego przykładu przestrzeń nazw:

<?xml version="1.0"?>

<?xml-stylesheet type="application/xml" href="people.xsl"?>

<people xmlns="http://www.cafeconleche.org/namespaces/people">

<person born="1912" died="1954">

<name>

<first_name>Alan</first_name>

<last_name>Turing</last_name>

</name>

<profession>computer scientist</profession>

<profession>mathematician</profession>

<profession>cryptographer</profession>

</person>

<person born="1918" died="1988">

<name>

<first_name>Richard</first_name>

<last_name>Feynman</last_name>

</name>

<profession>physicist</profession>

</person>

</people>

Rozważane wcześniej arkusze XSLT nie mają zastosowania do tak zmodyfikowanego dokumentu XML.

Informację o przestrzeni nazw musimy dodać do arkusza XSLT.

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:pe="http://www.cafeconleche.org/namespaces/people">

...

</xsl:stylesheet>

Ponadto do elementów w dokumencie XML pochodzących z tej przestrzeni nazw musimy odwoływać się za pomocą zdefiniowanych prefixów.

XSLT – przestrzenie nazw

Przykład 10 <?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:pe="http://www.cafeconleche.org/namespaces/people">

<xsl:template match="pe:people">

<html>

<head>

<title>Famous Scientists</title>

</head>

<body>

<xsl:apply-templates/>

</body>

</html>

</xsl:template>

<xsl:template match="pe:name">

<p>

<xsl:value-of select="pe:last_name"/>

<xsl:value-of select="pe:first_name"/>

</p>

</xsl:template>

<xsl:template match="pe:person">

<xsl:apply-templates select="pe:name"/>

</xsl:template>

</xsl:stylesheet>

XSLT – przestrzenie nazw

xsl:for-each

Arkusze XSLT umożliwiają iteracyjne przeglądanie elementów dokumentu XML

Wykorzystujemy w tym celu element:

<xsl:for-each select="nazwa_elementu">

</xsl:for-each>

Przykład 11

<xsl:template match="people">

<xsl:for-each select="person">

<xsl:value-of select="name"/>

<xsl:value-of select="@born"/>

</xsl:for-each>

</xsl:template>

Wynik:

Alan Turing 1912 Richard Feynman 1918

Modyfikacja:

<xsl:template match="people">

<table border="1">

<tr><td>Name</td><td>Born</td></tr>

<xsl:for-each select="person">

<tr>

<td><xsl:value-of select="name"/></td>

<td><xsl:value-of select="@born"/></td>

</tr>

</xsl:for-each>

</table>

</xsl:template>

Wynik:

xsl:for-each

Arkusze XSLT umożliwiają testowanie zawartości elementów dokumentu XML

Wykorzystujemy w tym celu element:

<xsl:if test="warunek">

</xsl:if>

Przykład 12 <xsl:template match="people">

<xsl:for-each select="person">

<xsl:value-of select="name"/>

<xsl:if test="@born=‘1912’">

died in <xsl:value-of select="@died"/>

</xsl:if>

</xsl:for-each>

</xsl:template>

Wynik:

Alan Turing died in 1954 Richard Feynman

xsl:if

Arkusze XSLT umożliwiają przetwarzanie warunkowe zawartości dokumentu XML.

Wykorzystujemy w tym celu element:

<xsl:choose>

<xsl:when test="warunek">

. . .

</xsl:when>

<xsl:otherwise>

. . .

</xsl:otherwise>

</xsl:choose>

xsl:choose

Wynik:

Przykład 13

<xsl:template match="people">

<xsl:for-each select="person">

<p>

<xsl:value-of select="name"/>

<xsl:choose>

<xsl:when test="@died=‘1912’">

died in 1912

</xsl:when>

<xsl:otherwise>

did not die in 1912

</xsl:otherwise>

</xsl:choose>

</p>

</xsl:for-each>

</xsl:template>

Alan Turing died in 1954 Richard Feynman did not die in 1954

xsl:choose

Arkusze XSLT umożliwiają sortowanie zawartości dokumentu XML.

Wykorzystujemy w tym celu element:

<xsl:sort selection="element">

. . .

</xsl:sort>

Sortowanie ograniczone jest do elementów:

<xsl:apply-templates>. . .</xsl:apply-templates>

<xsl:for-each>. . .</xsl:for-each>

xsl:sort

Wynik:

Przykład 14

<xsl:template match="people">

<xsl:apply-templates>

<xsl:sort select="name"/>

</xsl:apply-templates>

</xsl:template>

Alan Turing computer scientist mathematician cryptographer Richard Feynman physicist

Wynik:

<xsl:template match="people">

<xsl:apply-templates>

<xsl:sort select="name" order="descending"/>

</xsl:apply-templates>

</xsl:template>

Richard Feynman physicist Alan Turing computer scientist mathematician cryptographer

xsl:sort

XPath

XPath to język służący do adresowania części dokumentu XML.

Dzięki XPath potrafimy odwoływać się do różnych elementów dokumentu XML.

Rozważmy przykładowy dokument XML dla którego zapiszemy przykładowe adresowania.

<?xml version="1.0"?>

<?xml-stylesheet type="application/xml" href="people.xsl"?>

<people>

<person born="1912" died="1954">

<name>

<first_name>Alan</first_name>

<last_name>Turing</last_name>

</name>

<profession>computer scientist</profession>

<profession>mathematician</profession>

</person>

<person born="1918" died="1988">

<name>

<first_name>Richard</first_name>

<last_name>Feynman</last_name>

</name>

<profession>physicist</profession>

</person>

</people>

XPath

XPath

1. Wszystkie elementy person będące dziećmi elementu people

Przykładowe adresowania:

/people/person

2. Wszystkie elementy person znajdujące się w dokumencie

//person

Ogólnie

/t1/t2/t3/…/tn

W przypadku rozważanego dokumentu XML wyniki powyższych adresowań będą identyczne.

XPath

3. Atrybut @born znajdujący się w elemencie person

/person/@born

4. Atrybut @born znajdujący się w elemencie person i mający wartość "1912"

/person/@born="1912"

5. Wszystkie osoby urodzone w roku "1912"

//person[@born="1912"]

6. Pierwszy element person z dokumentu XML

//person[1]

7. Ostatnia profesja (profession) z pierwszego elementu person

//person[1]/profession[last()]

XPath

8. Wszystkie elementy person nie posiadające daty urodzenia

//person[not @born]