Transcript Document

Wykład 5
XML w obiektowo-relacyjnej bazie
danych
SZB, L.Banachowski
1
Zastosowanie dokumentów XML
1. Zamieszczanie metadanych w dokumencie
tekstowym.
2. Oddzielenie prezentacji od struktury dokumentu,
przez co umożliwienie różnych prezentacji tego
samego dokumentu.
3. Ułatwienie wymiany danych biznesowych między
aplikacjami. Integracja danych pochodzących z
różnych baz danych i aplikacji.
SZB, L.Banachowski
2
Od dokumentów tekstowych do oznakowanych
dokumentów – dokumentów XML
• Do każdego dokumentu tekstowego można dodać
oznakowanie w celu wprowadzenia dodatkowych informacji
takich jak autor, słowa kluczowe, powiązania z innymi
dokumentami bądź w celu odzwierciedlenia jego wewnętrznej
struktury.
•
Internet zmienił pojęcie dokumentu – teraz to pojęcie
obejmuje również obrazy, klipy video – tekst często pojawia się
tylko w deskryptywnych znacznikach.
SZB, L.Banachowski
3
Dostosowywanie prezentacji danych
• Poprzez rozdzielenie danych od ich prezentacji –
koncentracja uwagi w aplikacjach biznesowych jest na
operacjach biznesowych abstrahując od urządzeń, jakie zostaną
użyte teraz lub w przyszłości do wyświetlenia danych.
• Prezentację danych dokumentu można zmienić poprzez
zmianę towarzyszącego dokumentowi arkusza stylów – bez
konieczności modyfikowania logiki biznesowej czy
reprezentacji danych w bazie danych.
SZB, L.Banachowski
4
Ułatwienie wymiany danych biznesowych
między aplikacjami. Integracja informacji.
• Łatwiej jest wymienić dane między aplikacjami –
wystarczy skupić się na danych i ich strukturze abstrahując
od konkretnych protokołów sieciowych i komunikacyjnych,
bez konieczności interpretowania wewnętrznych i
wzajemnie niezgodnych formatów przesyłania danych w
sieci.
SZB, L.Banachowski
5
Problem integracji informacji
• Powiązane dane istnieją w różnych miejscach i może zaistnieć
potrzeba jednoczesnego ich użycia przez jedną aplikację.
• Ale bazy danych mogą się różnić:
 modelem (np. relacyjny, obiektowo-relacyjny, pliki MS Excel),
 schematem (np. znormalizowany, nieznormalizowany),
 terminologią (np. czy konsultanci firmy są pracownikami, czy
emerytowani pracownicy są pracownikami),
 konwencjami (np. stopnie Celsjusza lub Fahrenheita).
SZB, L.Banachowski
6
Przykład HTML: Lista publikacji
<HTML>
<BODY>
Fikcja:
<UL><LI>Autor: Milan Kundera</LI>
<LI>Tytuł: Identity</LI>
<LI>Rok: 1998</LI>
</UL>
Nauka:
<UL><LI>Autor: Richard Feynman</LI>
<LI>Tytuł: The Character of Physical Law</LI>
<LI>Twarda okładka</LI>
</UL>
</BODY>
</HTML>
SZB, L.Banachowski
7
Rodzielenie danych od ich
prezentacji: XML i XSL
v
Rozszerzalny język znaczników (Extensible
Markup Language) XML - opisuje
semistrukturalne dane.
v
Rozszerzalny język arkuszy stylów (Extensible
Stylesheet Language) XSL - prezentacja danych
poprzez użycie arkuszy stylów.
SZB, L.Banachowski
8
Przykład XML: Lista publikacji
<LISTA>
<PUBLIKACJA>
<AUTOR>
<IMIĘ>Milan</IMIĘ ><NAZWISKO>Kundera</NAZWISKO>
</AUTOR>
<TYTUŁ>Identity</TYTUŁ>
<ROK>1998</ROK>
</PUBLIKACJA>
<PUBLIKACJA>
<AUTOR>
<IMIĘ>Richard</IMIĘ><NAZWISKO>Feynman</NAZWISKO>
</AUTOR>
<TYTUŁ>The Character of Physical Law</TYTUŁ>
<FORMAT>Twardy</FORMAT>
</PUBLIKACJA>
</LISTA>
SZB, L.Banachowski
9
Widok w postaci drzewa
LISTA
PUBLIKACJA
PUBLIKACJA
AUTOR
IMIĘ
Milan
TYTUŁ
PUBLIKACJA
ROK
AUTOR
FORMAT
TYTUŁ
Identity 1998
NAZWISKO
IMIĘ
Kundera
SZB, L.Banachowski
The
Hardcharacter cover
NAZWISKO
of physical law
Richard Feynman
10
Modelowanie powiązań między obiektami w
ramach jednego dokumentu XML
• Model danych XML umożliwia powiązania między obiektami. Na
przykład: jedna publikacja ma wielu autorów; jeden autor jest
autorem wielu publikacji.
• Typ danych ID pozwala wprowadzić identyfikatory dla obiektów.
Typy danych IDREF i IDREFS pozwalają korzystać ze wskaźników
do obiektów. IDREF oznacza pojedynczy wskaźnik; IDREFS oznacza
listę wskaźników.
• Ta cecha pozwala definiować semistrukturalne dane w postaci
dowolnego grafu nie tylko drzewa.
SZB, L.Banachowski
11
Przykład: publikacje i autorzy
<LISTA>
<AUTOR Id_autora="LB" Lista_pub="BD1,BD2,BD3">
<IMIĘ>Lech</IMIĘ ><NAZWISKO>Banachowski</NAZWISKO>
</AUTOR>
<AUTOR Id_autora="KS" Lista_pub="BD1,BD2,SO">
<IMIĘ>Krzysztof</IMIĘ ><NAZWISKO> Stencel</NAZWISKO>
</AUTOR>
<PUBLIKACJA Id_publikacji="BD1" Lista_autor="LB, KS">
<TYTUŁ>Bazy danych Projektowanie aplikacji</TYTUŁ>
<ROK>2001</ROK> </PUBLIKACJA>
<PUBLIKACJA Id_publikacji="BD2" Lista_autor="LB,KS,AC,EM,KM">
<TYTUŁ>Bazy danych Wykłady i ćwiczenia</TYTUŁ>
<FORMAT>Twardy</FORMAT>
</PUBLIKACJA>
........
</LISTA>
SZB, L.Banachowski
12
ID, IDEREF i IDEREFS
• Wartością atrybutu ID musi być nazwa. Wszystkie wartości ID w
dokumencie muszą być różne. Wartości ID jednoznacznie określają
poszczególne elementy w dokumencie. Element może mieć tylko
jeden atrybut typu ID.
• Wartością atrybutu IDREF musi być nazwa występująca jako
wartość atrybutu ID w ramach dokumentu.
• Wartością atrybutu IDREFS musi być lista nazw występujących
jako wartości atrybutów ID w ramach dokumentu.
SZB, L.Banachowski
13
Metody reprezentowania dokumentów
•
Dokumenty tekstowe mogą być w bazie danych
reprezentowane za pomocą nowego obiektowego typu
danych – TextType lub XMLType, którego wartości
mogą się pojawić jako wartości kolumny w tabeli.
• Może być zastosowana struktura CLOB.
• Dokumenty XML o ustalonym schemacie mogą być
reprezentowane przez zbiór zwykłych tabel relacyjnych.
SZB, L.Banachowski
14
XQuery
• Język zapytań dla dokumentów XML - XQuery jest
standardem rekomendowanym przez organizację W3C.
• Niezależnie inna organizacja zajmująca się standardem
języka SQL opracowała wersję języka SQL obejmującą
dokumenty XML – SQL/XML. (http://sqlx.org).
Rekomendowany przez W3C od 23.01.2007
SZB, L.Banachowski
15
XQuery: zapytania na dokumentach XML
v
v
v
Cel: deklaratywny język wysokiego poziomu
umożliwiający przetwarzanie dokumentów XML.
XQuery – zapytania dotyczące danych w
dokumentach XML, tłumaczenia danych XML przy
integracji danych pochodzących z różnych źródeł.
Obejmuje wyrażenia XPath wyznaczające elementy
w dokumencie XML.
SZB, L.Banachowski
16
Użycie wyrażeń XPath do wyszukiwania
XPath jest standardem W3C służącym do nawigowania po
dokumentach XML. XPath używa modelu drzewa dla
dokumentu XML. Dostarcza bogatego zbioru operacji do
poruszania się po drzewie. Umożliwia stosowanie predykatów i
funkcji w odniesieniu do węzłów. Wynikiem zastosowania
wyrażenia XPath do dokumentu XML jest zbiór węzłów (w
szczególności pusty lub jednoelementowy).
SZB, L.Banachowski
17
Przykłady wyrażeń XPath
/BOOKLIST/BOOK wyznacza wszystkie elementy BOOK,
które są następnikami głównego elementu BOOKLIST.
//AUTHOR /LASTNAME wyznacza wszystkie elementy
LASTNAME, które są następnikami dowolnego elementu
AUTHOR osiągalnego z głównego elementu.
W nawiasach [ ] są formułowane predykaty. Można używać
spójników logicznych jak OR, AND i NOT np.
/BOOKLIST/BOOK[PUBLISHED=2001 OR
PUBLISHED=2002]/AUTHOR/LASTNAME
wyznacza wszystkie elementy LASTNAME autorów książek
opublikowanych albo w 2001 albo w 2002.
SZB, L.Banachowski
18
XQuery: Zapytania na danych XML
v
Zapytanie
– FOR
$l IN doc(www.books.com/books.xml)//AUTHOR /LASTNAME
RETURN <RESULT> $l </RESULT>
– wyznacza nazwiska wszystkich autorów.
v
Klauzula RETURN służy do zbudowania wyniku
zapytania w postaci dokumentu XML:
<RESULT><LASTNAME>Kowalski</LASTNAME></RESULT>
<RESULT><LASTNAME>Borowski</LASTNAME></RESULT>
SZB, L.Banachowski
19
XQuery (c.d.)
Podstawową postacią zapytania XQuery jest
wyrażenie FLWR:
FOR – określa zmienną, której wartości przebiegają zbiór
elementów określony przez wyrażenie XPath,
LET – określa zmienną, której wartością jest cały zbiór
elementów,
WHERE – filtr na zwracane wartości,
RESULT – wynikowy dokument XML.
SZB, L.Banachowski
20
XQuery (c.d.)
LET
$l IN doc(www.ourbookstore.com/books.xml)//AUTHOR/LASTNAME
RETURN <RESULT> $l </RESULT>
daje wynik:
<RESULT>
<LASTNAME>Kowalski</LASTNAME>
<LASTNAME>Borowski</LASTNAME>
</RESULT>
SZB, L.Banachowski
21
XQuery (c.d.)
FOR
$b IN doc(www.ourbookstore.com/books.xml)/BOOKLIST/BOOK
WHERE $b/PUBLISHED=’1980’
RETURN <RESULT> $b/AUTHOR/FIRSTNAME,
$b/AUTHOR/LASTNAME</RESULT>
daje wynik:
<RESULT><FIRSTNAME>Jan</FIRSTNAME>
<LASTNAME>Kowalski</LASTNAME>
</RESULT>
<RESULT><FIRSTNAME>Andrzej</FIRSTNAME>
<LASTNAME>Borowski</LASTNAME>
</RESULT>
SZB, L.Banachowski
22
XQuery (c.d.)
Dla każdego roku wyznacz nazwiska autorów, którzy
opublikowali książkę w tym roku.
FOR $p IN DISTINCT
doc(www.ourbookstore.com/books.xml)/BOOKLIST/BOOK/PUBLISHED
RETURN
<RESULT> $p,
FOR $a IN DISTINCT
/BOOKLIST/BOOK[PUBLISHED=$p]/AUTHOR/LASTNAME
RETURN $a
</RESULT>
daje w wyniku
<RESULT><PUBLISHED>1980</PUBLISHED>
<LASTNAME>Kowalski</LASTNAME>
<LASTNAME>Borowski</LASTNAME>
</RESULT> ....
SZB, L.Banachowski
23
Alternatywna reprezentacja danych
XML w bazie danych
odwzorowanie elementów dokumentu XML na
tabele
BOOKLIST(id:integer)
BOOK(id:integer, booklist:integer,
title: string, published: string, genre: string,
format: string)
AUTHOR(bookid:integer, firstname: string,
lastname: string)
SZB, L.Banachowski
24
Konwersja: XQuery -> zapytanie SQL
FOR
$b IN doc(www.ourbookstore.com/books.xml)/BOOKLIST/BOOK
WHERE $b/PUBLISHED=’1980’
RETURN <RESULT> $b/AUTHOR/FIRSTNAME,
$b/AUTHOR/LASTNAME</RESULT>
na:
SELECT BOOK.id, AUTHOR.firstname, AUTHOR.lastname,
FROM BOOK, BOOKLIST, AUTHOR
WHERE BOOKLIST.id = BOOK.booklistid AND
BOOK.id=AUTHOR.bookid AND BOOK.published=’1980’
GROUP BY BOOK.id;
SZB, L.Banachowski
25
Prezentacja danych relacyjnych w
postaci dokumentu XML
<ROWSET Table="Emp">
<ROW><EMPNO>2345</EMPNO>
<ENAME>SCOTT</ENAME>
...
</ROW>
<ROW> ....
</ROW>
....
</ROWSET>
SZB, L.Banachowski
26
Tekstowa baza danych
v
v
Tekstowa baza danych: zbiór dokumentów
tekstowych
Ważna klasa zapytań – wyszukiwania po słowach
kluczowych
– Zapytania boolowskie: Składniki zapytania są powiązane
spójnikami AND, OR i NOT. Wynikiem zapytania jest lista
dokumentów, które spełniają wyrażenie boolowskie np.
u
Database AND (Microsoft OR Oracle)
– Zapytania rankingowe: Wynikiem zapytania jest lista
dokumentów, które spełniają wyrażenie boolowskie,
uporządkowane według stopnia istotności danego
dokumentu dla zapytania.
SZB, L.Banachowski
27
Model wektorowy
Zawiera informacje: termin j występuje k razy w
dokumencie i.
docid
Agent
Bond
Chain
James
Mobile
movie
1
2
3
1
1
0
1
2
0
0
6
0
3
0
3
2
0
0
0
2
0
4
1
2
0
2
0
3
SZB, L.Banachowski
28
Miary istotności
Precyzja (precision) – procent zwracanych dokumentów,
które są istotne dla zapytania.
Zwracalność (recall)- procent istotnych dokumentów
zwracanych w odpowiedzi na zapytanie.
Zwrócenie wszystkich dokumentów gwarantuje dobrą
zwracalność ale bardzo słabą precyzję. Problemem jest
osiągnięcie jednocześnie dobrej zwracalności i precyzji.
SZB, L.Banachowski
29
Wyszukiwanie w tekstach - pliki
odwrócone
v
v
v
Dla każdego terminu
zapisujemy listę odwróconą
identyfikatorów DID
dokumentów, w których
występuje ten termin.
Wyznaczenie wyniku
zapytania: przecięcie lub
suma list odwróconych.
Przykład: Agent AND James
- przecięcie dwóch list
odwróconych.
SZB, L.Banachowski
DID
Dokument
1
Agent James
2
Mobile agent
Agent
Lista
odwrócona
<1,2>
James
<1>
Mobile
<2>
Słowo
30
Zastosowanie funkcji haszującej
v
v
v
v
h(k) – wektor bitowy dla słowa kluczowego k
Niech dokument D zawiera słowa kluczowe k1,…,kn.
Sygnatura dokumentu H(D)=h(k1) OR … OR h(kn)
Jeśli zapytanie dotyczy koniunkcji słów kluczowych z1,…, zi
liczymy sygnaturę zapytania: H(Z)=h(z1) OR … OR h(zi)
Szukamy wszystkich dokumentów D takich, że
H(Z) AND H(D) = H(Z) (czyli H(D) zawiera H(Z))
(ograniczając się do sygnatur dokumentów)
i tylko dla nich sprawdzamy czy D należy do wyników
zapytania Z tj. czy wszystkie słowa kluczowe zapytania Z
zawierają się w zbiorze słów kluczowych dokumentu D.
SZB, L.Banachowski
31
Oracle Text
Przeszukiwanie zbiorów dokumentów takich jak:
1. strony WWW
2. magazyny dokumentów
3. biblioteki cyfrowe
•
•
•
•
•
Najpierw indeksuje się zawartość zbioru dokumentów.
Dokumenty mogą być różnych formatów jak HTML, PDF, MS
Word.
Dokumenty są przechowywane w tabeli dokumentów.
Zapytania składają się zwykle ze słów i fraz oraz operatorów
takich jak OR i AND.
Wyniki mogą być uporządkowane względem stopnia
odpowiedniości.
SZB, L.Banachowski
32
Utworzenie tabeli z dokumentami
CREATE TABLE docs (id NUMBER PRIMARY KEY,
text VARCHAR2(200));
Wstawienie dokumentów tekstowych
INSERT INTO docs VALUES(1,
'<HTML>California is a state in the US.</HTML>');
INSERT INTO docs VALUES(2,
'<HTML>Paris is a city in France.</HTML>');
INSERT INTO docs VALUES(3,
'<HTML>France is in Europe.</HTML>');
SZB, L.Banachowski
33
Tworzenie indeksu typu CONTEXT
CREATE INDEX idx_docs ON docs(text)
INDEXTYPE IS CTXSYS.CONTEXT;
Indeksuje wszystkie słowa zbioru dokumentów.
Używa struktury danych list odwróconych.
SZB, L.Banachowski
34
Zapytanie rankingowe
Znajdź dokumenty zawierające słowo France:
COLUMN text FORMAT a40;
SELECT SCORE(1), id, text FROM docs
WHERE CONTAINS(text, 'France', 1) > 0;
SCORE(1) ID TEXT
------------ ---- ----------------------------------------------------------4
3 <HTML>France is in Europe.</HTML>
4
2
<HTML>Paris is a city in France.</HTML>
SZB, L.Banachowski
35
Odwołania do dwóch wyszukiwań
SELECT title, body, SCORE(1), SCORE(2)
FROM news
WHERE CONTAINS (news.title, 'Oracle', 1) > 0 OR
CONTAINS (news.body, 'java', 2) > 0
ORDER BY SCORE(1), SCORE(2);
SZB, L.Banachowski
36
Oracle: Typ obiektowy XMLType
CREATE TABLE Kontakty(
Nazwisko VARCHAR2(50),
Karta XMLTYPE,
Data_utworzenia DATE);
lub
CREATE TABLE Obj_Kontakty OF XMLType;
SZB, L.Banachowski
37
Wstawianie do kolumn typu XMLType
INSERT INTO Kontakty VALUES ('KOWALSKI',
XMLType('<KARTA>
<EMAIL>[email protected]</EMAIL>
<TEL_PRACA>33-456</TEL_PRACA>
<TEL_DOM>28-991</TEL_DOM>
<TEL_KOM>600-345</TEL_KOM>
<ADRES>
<ULICA>Wygodna 9m1</ULICA>
<MIASTO>Warszawa</MIASTO>
<KOD>02-782</KOD>
</ADRES>
</KARTA>'),
Sysdate);
SZB, L.Banachowski
38
Wstawianie do kolumn typu XMLType
INSERT INTO Kontakty VALUES ('NOWAK',
XMLType(BFILENAME('XMLDIR', 'JanNowak.xml'),
Sysdate);
SZB, L.Banachowski
39
Wyszukiwanie w dokumentach XML
v
Przy wydobywaniu danych z obiektu typu
XMLType korzystamy z metod konwersji :
– GetStringval(): XMLType -> VARCHAR2
– GetClobval(): XMLType -> CLOB
– GetNumberval: XMLType -> NUMBER
SZB, L.Banachowski
40
Wyszukiwanie w dokumentach XML
v
v
v
Metoda Extract z użyciem argumentu będącym
wyrażeniem XPath wyznacza wszystkie elementy
dokumentu XML opisane przez podaną ścieżkę.
SELECT
w.Karta.Extract('/KARTA/EMAIL/text()').GetStringVal()
"EMail"
FROM Kontakty w;
W wyniku otrzymujemy kolumnę wartości typu
VARCHAR2:
EMail
[email protected]
[email protected]
SZB, L.Banachowski
41
v
v
v
Bez funkcji text() na końcu wyrażenia ścieżkowego:
SELECT
w.Karta.Extract('/KARTA/EMAIL').GetStringVal()
"EMail"
FROM Kontakty w;
otrzymamy wartości typu VARCHAR2:
EMail
----------------------------------------------------------<EMAIL>[email protected]</EMAIL>
<EMAIL>[email protected]</EMAIL>
SZB, L.Banachowski
42
v
v
Aby wziąć cały dokument XML i przesłać go
jako duży dokument tekstowy typu CLOB:
SELECT w.Karta.GetClobval() as KartaKow
FROM Kontakty w
WHERE w.Nazwisko = 'KOWALSKI';
SZB, L.Banachowski
43
v
v
v
Aby sprawdzić czy w dokumencie XML występuje
element <WWW> stosujemy metodę ExistsNode:
SELECT w.Nazwisko,
w.Karta.ExistsNode('/KARTA/WWW') "Ma stronę
WWW"
FROM Kontakty w
WHERE w.Karta IS NOT NULL;
Wynik:
NAZWISKO Ma stronę WWW
----------------- ----------------------KOWALSKI 0
NOWAK
1
SZB, L.Banachowski
44
Aktualizacja kolumny XMLType
UPDATE Kontakty w
SET w.Karta = UpdateXML(w.Karta,
'/KARTA[EMAIL="[email protected]"]/TEL_DOM/text()',
'9999-10')
WHERE w.Nazwisko='KOWALSKI';
SZB, L.Banachowski
45
Aktualizacja kolumny XMLType
UPDATE Kontakty w
SET w.Karta = UpdateXML
(w.Karta,'/KARTA[EMAIL="[email protected]"]/ADRES',
XMLType('<ADRES>
<ULICA>Aksamitna 90m10</ULICA>
<MIASTO>Warszawa</MIASTO>
<KOD>12-782</KOD>
</ADRES>'))
WHERE w.Nazwisko='KOWALSKI';
SZB, L.Banachowski
46
Indeksy funkcyjne na kolumnach typu
XMLType
W celu przyśpieszenia wykonywania zapytania
SELECT w.Nazwisko FROM Kontakty w WHERE
w.Karta.Extract('/KARTA/ADRES/MIASTO/text()').GetStringVal()=
'WARSZAWA';
indeksuje się zawartości elementu MIASTO w dokumentach XML
kolumny Karta.
CREATE INDEX Miasto_index ON Kontakty w
(w.Karta.Extract('/KARTA/ADRES/MIASTO/text()').GetStringVal());
Zapytanie SQL użyje tego indeksu funkcyjnego, zamiast
parsować dokumenty XML wiersz po wierszu i obliczać wartości
wyrażeń XPath.
SZB, L.Banachowski
47
Zastosowanie indeksu typu CONTEXT
Korzystając z Oracle Text, można utworzyć indeks typu
CONTEXT na kolumnie zawierającej dane XML.
Aby wyznaczyć wszystkie zamówienia zawierające słowo
Pentium w elemencie DESC, możemy użyć operatora
WITHIN operator as follows:
SELECT p.id
FROM po_tab p
WHERE CONTAINS(p.doc, 'Pentium WITHIN desc') > 0;
SZB, L.Banachowski
48
XML Schema - poprawność
dokumentów XML
Najpierw rejestracja definicji XML Schema:
definition = ' ......';
DBMS_XMLSCHEMA.RegisterSchema
('http://myschema.pl/test.xsd', definition);
Następnie utworzenie tabeli z zapewnieniem sprawdzania
poprawności przechowywanych dokumentów:
CREATE TABLE EmpTable OF XMLType
XMLSchema "http://myschema.pl/test.xsd"
ELEMENT "Emplist";
-- Tabela obiektowa EmpTable dokumentów XML
SZB, L.Banachowski
49
Konwersja: dane relacyjne -> XML
CREATE TABLE XmlEmp OF XMLType;
query := 'SELECT empno, ename, sal, dname FROM emp JOIN
dept USING (deptno)';
INSERT INTO Xmlemp
SELECT DBMS_XMLGEN.getxmltype(query) FROM dual;
SELECT t.OBJECT_VALUE FROM xmlemp t; -- daje:
OBJECT_VALUE
--------------------------<ROWSET><ROW><EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME> ...</ROW>
<ROW> ...>/ROWSET>
SZB, L.Banachowski
50
Transformacja XSL
CREATE TABLE xslemp OF XMLType;
INSERT INTO xslemp VALUES(XMLType(
'<?xml version="1.0"?> <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="ROWSET">
<wml>
<card id="init" title="Test XML->WML”>
<p align="center"><small><b>Employees:</b>
<table> column="2">
<tr> <td><b>Person</b></td> <td><b>Dept</b></td></tr>
<xsl:appply-templates/>
</table></small></p></card></wml>
</xsl:template>
<xsl:template match="/ROWSET/ROW">
<tr> <td><xsl:value_of select="ENAME"/></td>
<td><xsl:value_of select="DEPTNO"/></td></tr>
</xsl:template>
</xsl:stylesheet>'))
SZB, L.Banachowski
51
Generowanie strony WWW z XML i XSL
CREATE OR REPLACE PROCEDURE xslt_test IS
doc XMLType;
BEGIN
SELECT p.OBJECT_VALUE.transform(t.OBJECT_VALUE)
INTO doc
FROM XMLemp p, xslemp t
WHERE ….;
htp.print(doc.getclobval);
END;
SZB, L.Banachowski
52