Sunteți pe pagina 1din 5

Cursul 2 - Java si XSL

Sectiunea 1. Introducere in XSL


Ce este XSL ?
CSS reprezinta styleheet-uri pentru fisiere HTML XSL reprezinta styleheet-uri pentru fisiere XML XSL este mai mult decat un stylesheet, fiind format din trei parti: * XSLT - limbaj pentru transformarea documentelor XML * XPath - limbaj pentru definirea unor parti dintr-un document XML * XSL FO - (Formatting Objects) vocabular pentru formatarea documentelor XML Cu alte cuvinte, XSL este un limbaj care poate transforma XML in HTML, poate filtra si sorta date XML, poate defini parti din documentul XML, poate formata datele XML in functie de valorile lor - cum ar fi afisarea valorilor negative cu rosu si poate transfmite datele XML catre diverse dispozitive de iesire. XSL is a standard recommended by the World Wide Web Consortium. The first two parts of the language (XSLT and XPath) became a W3C Recommendation in November 1999. The full XSL Recommendation including XSL formatting became a W3C Recommendation in October 2001. Internet Explorer 6 respecta in totalitate specificatiile consortiului W3C referitor la XSL

Sectiunea 2. XSLT
Ce este XSLT ?
XSLT (Extensible Stylesheet Language Transformation) este un limbaj functional definit de W3C, folosit pentru a procesa informatii structurate. Rolul sau principal este acela de a oferi o modalitate concreta de separare a continutului de prezentare. Functionalitatea sa este mai complexa, putand fi impartita in doua categorii: 1. de transformare a informatiei (XML - XML), respectiv 2. de prezentare (XML - HTML) Transformarea este de fapt transformarea uni arbore sursa intr-un arbore destinatie. Combinatia XSLT si XML poate fi asemanata cu cea dintre SQL si bazele de date relationale. Mai mult, XSLT este si un limbaj de programare. Permite efectuarea de calcule, rearanjarea sau sortarea datelor, combinarea datelor din surse multiple, personalizarea afisarii, etc.

Caracteristici de baza
1. Un stylesheet XSLT este un document XML Structura generala a unui document este:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- Sabloane --> </xsl:transform>

Asadar radacina unui document XSLT este <xsl:transform> sau <xsl:stylesheet>, cele doua fiind sinonime. Unui fisier XML ii poate fi asociat un stylesheet XSLT astfel:
<?xml-stylesheet type="text/xsl" href="fisier.xsl"?>

2. Paradigma de baza in procesare este "pattern matching" Un document XSLT este format dintr-o multime de reguli de potrivire (sabloane, template-uri) de forma "daca intrarea este de forma - genereaza urmatorul rezultat". Ordinea de aplicare a regulilor depinde de implementare, iar daca mai multe reguli pot fi aplicate pentru o anumita intrare, exista un algoritm pentru rezolvarea conflictelor. Procesarea nu se face linie cu linie, ca in cazul procesoarelor de texte, ci la nivel de nod, deoarece intrarea este un document XML, care are o structura arborescenta.

Procesoare XSLT
Arbore de intrare -> procesor XSLT -> Arbore de iesire O operatie atomica a parserului este procesarea unui nod. Exemple de parsere: MSXML folosit de IE6, XT Processor (Jamesc Clark), etc. Locul procesarii poat fi atat nivelul clientului sau la nivelul serverului.

Cursul 2 - Java si XSL Sintaxa XSLT


Cele mai importante tag-uri pe care la contine un fisier XSLT sunt: * Sabloanele (template-uri). Sunt functii care au ca intrare un fragment din arboreal de intare iar ca iesire un fragment din arborele rezultat si nu au efecte colaterale. Sintaxa lor este
<xsl:template match="fragment_intrare"> <!-- fragment iesire --> </xsl:template>

* <xsl:apply-templates/> * <xsl:value-of select="nod_expr_XPath" /> * <xsl:for-each select="nod_expr_XPath"> ... * <xsl:sort select="element" /> * <xsl:if test="conditie"> ... * <xsl:choose>
<xsl:when test="conditie" > ... <xsl:otherwise > ... </xsl:choose >

Sectiunea 3. XPath
Ce este XPath ?
XSLT foloseste un sub-limbaj numit XPath pentru referirea nodurilor din arborele de intrare. XPath este un limbaj de interogare conceput special pentru modelul ierarhic al unui document XML. Este capabil sa selecteze noduri prin navigarea in orice directie si aplicarea de predicate bazate pe valorile si pozitia nodurilor. Include facilitati pentru lucrul cu siruri, calcule numerice si operatii booleene. De exemplu, /@titlu selecteaza atributul 'titlu' al parintelui nodului curent. Expresiile XPath sunt folosite pentru: * selectarea nodurilor ce vor fi procesate * testarea unor conditii pe parcursul procesarii * calcularea valorilor ce vor fi inserate in arborele rezultat

Sintaxa
XPath foloseste expresii pentru localizarea nodurilor in cadrul unui document XML. Simbolurile de baza pentru constructia acestor expresii sunt: / // * [conditie] | @atribut Specificarea locatiilor O locatie XPath defineste o multime de noduri. Locatiile pot fi: absolute (/pas1/pas2) sau relative (pas1/pas2) Structura unui pas este directie::nod[predicat], unde * directie: defineste relatia dintre nodul curent si nodurile selectate de locatie si poate avea una din valorile parent, child, ancestor, descendant, self, etc. * nod: reprezinta nodurile ce vor fi selectate din directia aleasa * predicat: o conditie pentru filtrarea nodurilor rezultat, este cuprinsa intre paranteze patrate - [predicat] Sunt permise urmatoarele abrevieri * nod = child::nod * @ = attribute * . = self::node() * .. = parent::node() * // = descendant-or-self::node() Expresii XPath ofera suport pentru expresii numerice, relationale si booleene. Acestea sunt formate folosind urmatorii operatori: + - * div mod = != < <= > >= or and. In cazul testarii egalitatii se deosebeste situatia in care unul din argumente este o multime de noduri. Atunci, rezultatul va fi true daca exista valoarea testata macar in unul din nodurile din multimea respectiva, iar

Cursul 2 - Java si XSL


false daca exista un nod in multimea de noduri cu valoarea diferita de cea testata. Observati ca cele doua situatii nu se exclud una pe cealalata. Functii * la nivel de nod : position, count, last, name * pe siruri de carcatere: contains, concat, substring * numerice: number, round, floor, ceiling, sum * booleene: not

Sectiunea 4. Exemple de folosire a XSLT si XPath


Fisierul XML
<?xml-stylesheet type="text/xsl" href="note2.xsl"?> <note an="3"> <student> <nume> Ionescu </nume> <nota disciplina="Java"> 10 </nota> <nota disciplina="C"> 8 </nota> </student> <student> <nume> Popescu </nume> <nota disciplina="Java"> 7 </nota> <nota disciplina="C"> 5 </nota> </student> </note>

Fisiere XSLT
Varianta 1
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="note"> <html> <body> <h1>Note anul <xsl:value-of select="@an"/></h1> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="student"> <p> <xsl:value-of select="nume"/> : <xsl:value-of select="nota[1]/@disciplina"/> <xsl:value-of select="nota[1]"/> , <xsl:value-of select="nota[2]/@disciplina"/> <xsl:value-of select="nota[2]"/> , Media: <xsl:value-of select="(nota[1] + nota[2]) div 2"/> </p> </xsl:template> </xsl:transform>

Varianta 2
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="note"> <html> <body> <h1>Statistica anul <xsl:value-of select="@an"/></h1> <xsl:variable name="tot" select="//student/nota/@disciplina" />

Cursul 2 - Java si XSL


<xsl:variable name="dif" select="$tot[not(.=preceding::student/nota/@disciplina)]" /> <xsl:for-each select="$dif"> <p> <xsl:variable name="this" select="." /> <xsl:variable name="note" select="//student/nota[./@disciplina=$this]"/> <xsl:value-of select="$this"/> : <xsl:value-of select="sum($note) div count($note) "/> </p> </xsl:for-each> </body> </html> </xsl:template> </xsl:transform>

Sectiunea 5. Java si XSLT


TrAX
TrAX este acronimul de la Transformation API for XML si reprezinta parte integranta din JAXP. Scopul acestei interfete de programare este de a transforma un document XML sursa, folosind niste reguli specificate in limbajul XSLT, intr-un document XML destinatie. XML sursa -> arbore DOM sursa ->(XSLT)-> arbore DOM destinatie -> XML destinatie Pachete necesare se gasesc in distributia Xalan si cele mai importante sunt: * javax.xml.transform * javax.xml.transform.dom * javax.xml.transform.stream

Etapele transformarii
Procesul transformarii datelor folosind TrAX este extrem de simplu si consta in urmatoarele etape: Crearea arborelui DOM sursa si celui rezultat
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document sourceDoc = db.parse(new File(filename)); Document resultDoc = db.newDocument();

Stabilirea sursei si a rezultatului Acestea pot fi fisiere, arbori in memorie sau chiar fluxuri de date cum ar fi un flux SAX sau un flux de iesire catre ecran.
Source source = new DOMSource(sourceDoc); Result result = new DOMResult(resultDoc);

Crearea unui obiect de tip Transformer, bazat pe un XSLT


//Stabilirea regulilor de transformare Source style = new StreamSource("procesare.xsl"); //Crearea obiectului de tip Transformer TransformerFactory transFactory = TransformerFactory.newInstance(); Transformer transformer = transFactory.newTransformer(style);

Transformarea propriu-zisa
//Transformarea documentului transformer.transform(source, result);

Sectiunea 6. XML, XSLT si baze de date relationale


Utilitatea XSLT
Arhitecturi de aplicatii: locale, 2, 3 -nivele Proceduri stocate

Cursul 2 - Java si XSL


Simularea procedurilor stocate folosind transformari XSLT

Corespondenta XML - baze de date


Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); c = DriverManager.getConnection(dburl); Statement s = c.createStatement(); //ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE; ResultSet = s.executeQuery("select"); s.executeUpdate("update/insert/delete"); ResultSet // next(), getXXX() ResultSetMetaData // getColumnCount, getColumnName

Crearea unui fisier XML dintr-o baza de date


Document dataDoc = db.newDocument() Element root = dataDoc.createElement("root") //pt fiecare tabel Element table = dataDoc.createElement("tabel") //pt fiecare linie Element row = dataDoc.createElement("row") //pt fiecare coloana Element col = dataDoc.createElement("colName") col.appendChild(dataDoc.createTextNode("colValue") row.appendChild(col); table.appendChild(row); root.appendChild(table); dataDoc.appendChild(root);

Popularea unui baze de date cu informatii dintr-un fisier XML


//aflu tabelele NodeList tables = dataDoc.getDocumentElement().getChildNodes(); for (int i=0; i < tables.getLength(); i++) { //For each table, get the table element and name Element thisTable = (Element)tables.item(i); String tableName = thisTable.getNodeName(); ResultSet s = st.executeQuery("select * from " + tableName); //Get the rows for this table NodeList rows = thisTable.getElementsByTagName("row"); //echivalent cu:thisTable.getChildNodes(); for (int j=0; j < rows.getLength(); j++) Element thisRow = (Element)rows.item(j); s.moveToInsertRow(); NodeList columns = thisRow.getChildNodes(); for (int k=0; k < columns.getLength(); k++) { //For each column element, get the element name and value Element thisColumn = (Element)columns.item(k); String colName = thisColumn.getNodeName(); String colValue = thisColumn.getFirstChild().getNodeValue(); s.updateString(colName, colValue);} s.insertRow();

S-ar putea să vă placă și