Ένα από τα προβλήματα των σαρωτών XML είναι οτι δεν
έχουν γίνει προσπάθειες τυποποίησης. Υπάρχει ένας αριθμός σαρωτών που
έχουν υλοποιηθεί με διαφορετικούς τρόπους και με διαφορετικά σύνολα
μεθόδοων. Για να ξεπεράσουμε αυτό το πρόβλημα έχει αναπτυχθέι ένα API
που καλεί έναν σαρωτή και στη συνέχεια επεξεργάζεται μια εσωτερική
μορφή του πηγαίου κώδικα XML που έχει χτίσει το API. Ένα τέτοιο API
γνωστό ως SAX (Simple API for XML) αντλεί τη προέλευσή του από μια
ταχυδρομική λίστα για την XML. Ο προγραμματιστής Peter Murray-Rust που
ανάπτυξε τον XML περιηγητή JUMBO έστειλε ένα μήνυμα που δήλωνε οτι είχε
βαρεθεί να συντηρεί τρείς εκδόσεις του JUMBO για τρείς διαφορετικούς
σαρωτές. Αυτό οδήγησε στη συνεργασία αρκετών προγραμματσιτών στη
δημιουργία του API.
Το SAX API περιέχει μια σειρά μεθόδους όμοιες με
αυτές του Aelfred:
Το SAX είναι ένα παράδειγμα επεξεργασίας συμβάντων:
η ιδέα πίσω από το SAX είναι οτι οι γραμμές μιας γλώσσας ορισμένης με
κάποιο XML DTD υφίστανται ακολουθιακή επεξεργασία και κάθε φορά που
συναντάται ένα εναρκτήριο επίθεμα, εκτελέιται μια μέθοδος που
σχετίζεται με αυτό το συμβάν.
Ένα παράδειγμα κώδικα SAX φαίνεται παρακάτω. Το SAX
επεξεργάζεται το DTD που ακολουθεί:
<?xml version = "1.0" standalone = "yes'?>
<!DOCTYPE BOOKLIST [
<!ELEMENT BOOKLIST (BOOK)*>
<!ELEMENT BOOK (TITLE, AUTHORS, PRICE, PUBLISHER)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT AUTHORS (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ELEMENT PUBLISHER (#PCDATA)>
<!ATTLIST PRICE
AMOUNTCURRENCY CDATA #REQUIRED
DISCOUNT CDATA "0">
]>
Το DTD δίνει προδιαγραφές για περιγαρφή βιβλίων. Κάθε βιβλίο ορίζεται
από τον τίτλο, τους συαγγραφείς, την τιμή και τον εκδότη. Κάθε μια από
αυτές τις οντότητες ορίζεται από ένα αλφαριθμητικό. Η τιμή σχετίζεται
με μια ιδιότητα, που ορίζει το νόμισμα, το δε αλφαριθμητικό της τιμής
πρέπει να είναι ακέραιος αριθμός. Επίσης κάθε τιμή σχετίζεται με
προαιρετική έκπτωση. Αν δεν υπάρχει έκπτωση, η προκαθορισμένη τιμή της
είναι μηδέν.
Ακολουθεί ένα τεκμήριο XML που βασίζεται στο
συγκεκριμένο DTD.
<BOOKLIST>
<BOOK>
<TITLE>The Endless Path</TITLE>
<AUTHORS>Jones</AUTHORS>
<PRICE AMOUNTCURRENCY = "Pounds">200</PRICE>
<PUBLISHER>Pearson</PUBLISHER>
</BOOK>
<BOOK>
<TITLE>My Story</TITLE>
<AUTHORS>Roberts</AUTHORS>
<PRICE AMOUNTCURRENCY = "SW Francs">500</PRICE>
<PUBLISHER>McMillan</PUBLISHER>
</BOOK>
<BOOK>
<TITLE>XML for Beginners</TITLE>
<AUTHORS>Ince</AUTHORS>
<PRICE AMOUNTCURRENCY = "Dollarss" DISCOUNT = "5">300</PRICE>
<PUBLISHER>Pearson</PUBLISHER>
</BOOK>
<BOOK>
<TITLE>Java and Nirvana</TITLE>
<AUTHORS>Rowlands</AUTHORS>
<PRICE AMOUNTCURRENCY = "Pounds">400</PRICE>
<PUBLISHER>Wiley</PUBLISHER>
</BOOK>
</BOOKLIST>
Ακολουθεί ένα πρόγραμμα για την επεξεργασία του XML
τεκμηρίου.
//Imports for parser and SAX API
import org.apache.xerces.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
public class BookValues extends DefaultHandler
{
public static void main(String[] args)
{
BookValues b = new BookValues("catalogue.txt");
}
public BookValues(String file)
{
try
{
//Sets uo a parser
xParser.setContentHandler(this);
try
{
xParser.parse(file);
}
catch(Exception e)
{
System.out.println("Problem");
}
}
catch(Exception e)
{
System.out.println("Problem starting XML parser "
+ e.getMessage());
}
}
public void error(SAXParseException se)
{
//Executed when a serious error occurs
//in processing the XML source
System.out.println("Error: Problem with XML "
+ se.getMessage());
}
public void warning(SAXParseException se)
{
//Executed when a minor problem occurs
//in processing the XML source
System.out.println("Warning: Problem with XML "
+ se.getMessage());
}
public void startDocument() throws SAXException
{
//Executed when the XML document is started
System.out.println("Document started");
}
public void startElement (String elementName,
Attributes al) throws SAXException
{
//Executed when a start element is encountered
String attributeName, attributeValue;
System.out.println("Start ELEMENT = " + elementName);
if (al.getLength() > 0)
{
//The element has some attributes
System.out.println("Attributes are ");
for (int j=0; j<al.Length();j++)
{
//List the attributes, the method getLocalName
//returns the name and getValus returns the value
attributeName = al.getLocalName(j);
attributeValue = al.getValue(j);
System.out.println("Attribute name is + attributeName
+ " Attribute value is " + attributeValue);
}
}
}
public void endElement(String elementName)
throws SAXException
{
//Executed when an end element is encountered
System.out.println("End ELEMENT = " + elementName);
}
public void endDocument() throws SAXException
{
//Executed when the XML document is finished
System.out.println("Document finished");
}
public void characters(char[] chars, int start, int length)
throws SAXException
{
//Executed when a string is encountered
System.out.println("String read is " + new
String(chars, start, length));
}
}
Ο κώδικας αποτελείται από διάφορες μεθόδους. Οι
μέθοδοι startDocument κια endDocument εκτελούνται στην αρχή και στο
τέλος της σάρωσης του XML τεκμηρίου. Επίσης π[εριλαμβάνονται δύο
μέθοδοι -warning και error- που εκτελούνται να εμφανιστούν μέγάλα ή
μικρά προβλήματα στη σάρωση.
Οι υπόλοιπες μέθοδοι πυροδοτούνται με την εμφάνιση
των αντίστοιχων συμβάντων. Για παράδειγμα ο κώδικας
public void endElement(String elementName)
throws SAXException
{
//Executed when an end element is encountered
System.out.println("End ELEMENT = " + elementName);
}
εκτελείται όταν εμφανιστεί ένα ληκτικό επίθεμα. Μέσα
στη μέθόδο startElement που εκτελείται όταν εμφανίζεται ένα εναρκτήριο
επίθεμα υπάρχει ο κώδικας
if (al.getLength() > 0)
{
//The element has some attributes
System.out.println("Attributes are ");
for (int j=0; j<al.Length();j++)
{
//List the attributes, the method getLocalName
//returns the name and getValus returns the value
attributeName = al.getLocalName(j);
attributeValue = al.getValue(j);
System.out.println("Attribute name is + attributeName
+ " Attribute value is " + attributeValue);
}
}
Αυτός ελέγχει πρώτα αν υπάρχουν ιδιότητες για το
συγκεκριμένο στοιχείο. Αν όντως υπάρχουν τότε εκτελείται ο βρόχος for j
που εμφανίζει τα ονόματα και τις τιμές των ιδιοτήτων.
Ο κατασκευαστής περιέχει κώδικα που ενεργοποιεί τον
σαρωτή και ξεκινά τη διεργασία ανάγνωσης των γραμμών του τεκμηρίου XML.
Το αρχείου που περιέχει το κείμενο του τεκμηρίου περνάει στον σαρωτή
σαν όρισμα.
Το αποτέλεσμα που εμφανίζει η εκτέλεση του κώδικα
για το συγκεκριμένο αρχείο XML φαίνεται παρακάτω:
Document started
Start ELEMENT = BOOKLIST
Start ELEMENT = BOOK
Start ELEMENT = TITLE
String read is The Endless Path
End Element = TITLE
Start ELEMENT = AUTHORS
String read is Jones
End ELEMENT = AUTHORS
Start ELEMENT = PRICE
Attributes are
Attribute name is AMOUNTCURRENCY Attribute value is Pounds
Attribute name is DISCOUNT Attribute value is 0
String read is 200
End ELEMENT = PRICE
Start ELEMENT = PUBLISHER
Stringread is Pearson
End ELEMENT = PUBLISHER
End ELEMENT = BOOK
Start ELEMENT = BOOK
Start ELEMENT = TITLE
String read is My Story
End Element = TITLE
Start ELEMENT = AUTHORS
String read is Roberts
End ELEMENT = AUTHORS
Start ELEMENT = PRICE
Attributes are
Attribute name is AMOUNTCURRENCY Attribute value is PoundsSW Francs
Attribute name is DISCOUNT Attribute value is 0
String read is 500
End ELEMENT = PRICE
Start ELEMENT = PUBLISHER
Stringread is McMillan
End ELEMENT = PUBLISHER
End ELEMENT = BOOK
Start ELEMENT = BOOK
Start ELEMENT = TITLE
String read is XML for Beginners
End Element = TITLE
Start ELEMENT = AUTHORS
String read is Ince
End ELEMENT = AUTHORS
Start ELEMENT = PRICE
Attributes are
Attribute name is AMOUNTCURRENCY Attribute value is Dollars
Attribute name is DISCOUNT Attribute value is 5
String read is 300
End ELEMENT = PRICE
Start ELEMENT = PUBLISHER
Stringread is Pearson
End ELEMENT = PUBLISHER
End ELEMENT = BOOK
Start ELEMENT = BOOK
Start ELEMENT = TITLE
String read is Java and Nirvana
End Element = TITLE
Start ELEMENT = AUTHORS
String read is Rowlands
End ELEMENT = AUTHORS
Start ELEMENT = PRICE
Attributes are
Attribute name is AMOUNTCURRENCY Attribute value is Pounds
Attribute name is DISCOUNT Attribute value is 0
String read is 400
End ELEMENT = PRICE
Start ELEMENT = PUBLISHER
Stringread is Wiley
End ELEMENT = PUBLISHER
End ELEMENT = BOOK
End ELEMENT = BOOKLIST
Document finished
End ELEMENT
import org.w3c.dom.*;To DOM εργάζεται διατρέχοντας τους κόμβους ενός δένδρου του τεκμηρίου, παρόμοιο με αυτό του Σχήματος 8.4. Ένας κόμβος μπορεί να είναι διαφόρων τύπων και η δομή tου κώδικα που επεξργάζεται το κείμενο XML θα περιέχει μια μεγάλη συλλογή δηλώσεων if που θα ανακαλυπτουν τον τύπο του κάθε κόμβου και την επεξεργασία που πρέπει να υποστεί.
import org.ibm.xml.parser.Parser;
public class DOMParser
{
public static void displayXML(Node nd)
{
short nodeVal = nd.getNodeType();
if (nd.DOCUMENT_NODE==nodeVal)
{
//This is a document node, apply displayXML again
displayXML(((Document)nd).getDocumnetElement());
}
if (nd.ELEMENT_NODE==nodeVal)
{
//This is an element node, get the name of node
String nodeName = nd.getNodeName();
System.out.println("Name of Node = " + nodeName);
//Get the attributes
NamedNodeMap nm = nd.getAttriutes();
if (nm != null)
{
//There are some attributes, display them
for (int k=0;k<nm.getLength();k++)
{
//Iterate over getLangth attributes
Node currAttribute = nm.item(k);
//Get the name of the attribute
String attributeName =
currAttribute.getNodeName();
//Get the value of the attribute
String attributeValue =
currAttribute.getNodeValue();
System.out.println(
"Attribute name = " + attributeName +
"Attribute value = " + attributeValue);
}
}
//Get all the child nodes
NodeList nl = nd.getChildNodes();
//If there are any child nodes iterate over them
//executing displayXML again
if (nl != null)
{
for (int j=0;j<nl.getLength();j++)
displayXML(nl.item(j));
}
}
if (nd.TEXT_NODE==nodeVal)
{
//Text encoutered
if(!nd.getNodeValue().equals("\n"))
System.out.println(nd.getNodeValue());
}
}
public static void main(String[] args)
{
try
{
//Set up and sart the parser
String file = "catalogue.txt";
InputStream inStream = new FileInputStream(file);
Parser dp = new Parser(file);
Document doc = dp.readStream(inStream);
//Execute displayXML to display the XML source
displayXML(doc);
System.out.println("There were " +
dp.getNumberOfErrors() + " Errors");
}
catch (Exception E)
{
System.out.println ("Problem with XML processor " +e);
}
}
}
short nodeVal = nd.getNodeType();Η μέθοδος getNodeType επιστρέφει μια σταθερά τύπου short που καθορίζει τον τύπο του κόμβου. Ο κώδικας που απομένει εξετάζει τον κόμβο και εκτελεί την κατάλληλη επεξεργασία ανάλογα με τον τύπο του κόμβου. Πρώτα γίνεται έλεγχος αν πρόκειται για κόμβο τεκμηρίου
if (nd.DOCUMENT_NODE==nodeVal)
{
//This is a document node, apply displayXML again
displayXML(((Document)nd).getDocumnetElement());
}
<!DOCTYPE BOOKLIST SYSTEM "books.txt">
if (nd.ELEMENT_NODE==nodeVal)Πρώτα ο κώδικας βρίσκει το όνομα του κόμβου και το εμφανίζει, για παράδειγμα BOOK ή PUBLISHER. Στη συνέχεια βρίσκει τις ιδιότητες του στοιχείο και τις τοποθετεί στο αντικείμενο NameNodeMap..
//This is an element node, get the name of nodeΤο επόμενο τμήμα κώδικα
String nodeName = nd.getNodeName();
System.out.println("Name of Node = " + nodeName);
//Get the attributes
NamedNodeMap nm = nd.getAttriutes();
if (nm != null)πρώτα ελέγχει αν υπάρχουν ιδιότητες, για παράδειγμα AMOUNTCURRENCY. Στη συνέχεια προαπελαύνει όλες τις ιδιότητες στο nm. Κάθε ιδιότητα τοποθετείται σε μια μεταβλητή Node και στη συνέχεια εξάγονται το όνομα και η τιμή της μέσω των μεθόδων getNodeName και getNodeValue, για παράδειγμα AMOUNTCURRENCY και pounds. Τα αποτελέσματα εμφανίζοναι.
{
//There are some attributes, display them
for (int k=0;k<nm.getLength();k++)
{
//Iterate over getLangth attributes
Node currAttribute = nm.item(k);
//Get the name of the attribute
String attributeName =
currAttribute.getNodeName();
//Get the value of the attribute
String attributeValue =
currAttribute.getNodeValue();
System.out.println(
"Attribute name = " + attributeName +
"Attribute value = " + attributeValue);
}
}
//Get all the child nodesΗ μέθοδος item εξάγει τους κόμβους από τη λίστα και στη συνέχεια εφαρμόζεται η displayXML.
NodeList nl = nd.getChildNodes();
//If there are any child nodes iterate over them
//executing displayXML again
if (nl != null)
{
for (int j=0;j<nl.getLength();j++)
displayXML(nl.item(j));
}
<AUTHORS>Roberts</AUTHORS>Ο κώδικας είναι
if (nd.TEXT_NODE==nodeVal)Σε περίπτωση που το κείμενο είναι απλά αλλαγή γραμμής τότε αυτό δεν εμφανίζεται. Το τελικό τμήμα του κώδικα εγκαθιστά τη διαδικασία σάρωσης.
{
//Text encoutered
if(!nd.getNodeValue().equals("\n"))
System.out.println(nd.getNodeValue());
}
public static void main(String[] args)Το αρχείο catalogue.txt συνδέεται με ένα αντικείμενο inStream το οποίο χρησιμοποιείται ως είσοδος στον σαρωτή, που παράγει ως έξοδο το αντικείμενο doc το οποίο περνά ως είσοδος στη μέθοδο displayXML.
{
try
{
//Set up and sart the parser
String file = "catalogue.txt";
InputStream inStream = new FileInputStream(file);
Parser dp = new Parser(file);
Document doc = dp.readStream(inStream);
//Execute displayXML to display the XML source
displayXML(doc);
System.out.println("There were " +
dp.getNumberOfErrors() + " Errors");
}
catch (Exception E)
{
System.out.println ("Problem with XML processor " +e);
}
}
Name of Node = BOOKLIST
Name of Node = BOOK
Name of Node = TITLE
The Endless Path
Name of Node = AUTHORS
Jones
Name of Node = PRICE
Attributes are
Attribute name = AMOUNTCURRENCY Attribute value = Pounds
Attribute name = DISCOUNT Attribute value = 0
200
Name of Node = PUBLISHER
Pearson
Name of Node = BOOK
Name of Node = TITLE
My Story
Name of Node = AUTHORS
Roberts
Name of Node = PRICE
Attributes are
Attribute name = AMOUNTCURRENCY Attribute value = SW Fancs
Attribute name = DISCOUNT Attribute value = 0
500
Name of Node = PUBLISHER
McMillan
Name of Node = BOOK
Name of Node = TITLE
XML for Beginners
Name of Node = AUTHORS
Ince
Name of Node = PRICE
Attributes are
Attribute name = AMOUNTCURRENCY Attribute value = Dollars
Attribute name = DISCOUNT Attribute value = 5
300
Name of Node = PUBLISHER
Pearson
Name of Node = BOOK
Name of Node = TITLE
Java and Nirvana
Name of Node = AUTHORS
Rowlands
Name of Node = PRICE
Attributes are
Attribute name = AMOUNTCURRENCY Attribute value = Pounds
Attribute name = DISCOUNT Attribute value = 0
400
Name of Node = PUBLISHER
Wiley
There were 0 Errors
<DEPARTMENT:EMPLOYEELIST XMLNS:DEPARTMENT=
"http://www.open.ac.uk/users/Ince/Departments">
<DEPARTMENT:USER>
<DEPARTMENT:NAME>
Darrel Ince
</DEPARTMENT:NAME>
<DEPARTMENT:EMAILADDRESS>
D.C.Ince@computing.ac.uk
</DEPARTMENT:EMAILADDRESS>
</DEPARTMENT:USER>
<DEPARTMENT:USER>
<DEPARTMENT:NAME>
Walter Evans
</DEPARTMENT:NAME>
<DEPARTMENT:EMAILADDRESS>
W.Evans@computing.ac.uk
</DEPARTMENT:EMAILADDRESS>
</DEPARTMENT:USER>
<DEPARTMENT:USER>
<DEPARTMENT:NAME>
Robert Wilson
</DEPARTMENT:NAME>
<DEPARTMENT:EMAILADDRESS>
R.S.Wilson@computing.ac.uk
</DEPARTMENT:EMAILADDRESS>
</DEPARTMENT:USER>
</DEPARTMENT:EMPLOYEELIST>
<DEPARTMENT:EMPLOYEELIST XMLNS:DEPARTMENT=Οι γραμμές ήταν
"http://www.open.ac.uk/users/Ince/Departments"
XMLNS:USERDETAILS=
"http://www.open.ac.uk/users/Ince/UserDetails">
<DEPARTMENT:USER>
<DEPARTMENT:NAME>
Darrel Ince
</DEPARTMENT:NAME>
<USERDETAILS:JOBTITLE>
Programmer
</USERDETAILS:JOBTITLE>
<DEPARTMENT:EMAILADDRESS>
D.C.Ince@computing.ac.uk
</DEPARTMENT:EMAILADDRESS>
</DEPARTMENT:USER>
<DEPARTMENT:USER>
<DEPARTMENT:NAME>
Walter Evans
</DEPARTMENT:NAME>
<USERDETAILS:JOBTITLE>
Project manager
</USERDETAILS:JOBTITLE>
<DEPARTMENT:EMAILADDRESS>
W.Evans@computing.ac.uk
</DEPARTMENT:EMAILADDRESS>
</DEPARTMENT:USER>
<DEPARTMENT:USER>
<DEPARTMENT:NAME>
Robert Wilson
</DEPARTMENT:NAME>
<USERDETAILS:JOBTITLE>
Project assistant
</USERDETAILS:JOBTITLE>
<DEPARTMENT:EMAILADDRESS>
R.S.Wilson@computing.ac.uk
</DEPARTMENT:EMAILADDRESS>
</DEPARTMENT:USER>
</DEPARTMENT:EMPLOYEELIST>
XMLNS:USERDETAILS=εισάγουν έναν απομακρυσμένο χώρο ονομάτων που τα στοιχεία του μπορούν να χρησιμοποιηθούν τοπικά. Όμως τα στχοιεία πρέπει να έχουν ως πρόθεμα το όνομα του απομακρθσμένου χώρου ονομάτων, όπως στο
"http://www.open.ac.uk/users/Ince/UserDetails"
<USERDETAILS:JOBTITLE>Η προέλευση του χώρου ονομάτων
Programmer
</USERDETAILS:JOBTITLE>
<DEPARTMENT:EMPLOYEELIST XMLNS=
"http://www.open.ac.uk/users/Ince/Departments"
XMLNS:USERDETAILS=
"http://www.open.ac.uk/users/Ince/UserDetails">
<USER>
<NAME>
Darrel Ince
</NAME>
<USERDETAILS:JOBTITLE>
Programmer
</USERDETAILS:JOBTITLE>
<EMAILADDRESS>
D.C.Ince@computing.ac.uk
</EMAILADDRESS>
</USER>
<USER>
<NAME>
Walter Evans
</NAME>
<USERDETAILS:JOBTITLE>
Project manager
</USERDETAILS:JOBTITLE>
<EMAILADDRESS>
W.Evans@computing.ac.uk
</EMAILADDRESS>
</USER>
<USER>
<NAME>
Robert Wilson
</NAME>
<USERDETAILS:JOBTITLE>
Project assistant
</USERDETAILS:JOBTITLE>
<EMAILADDRESS>
R.S.Wilson@computing.ac.uk
</EMAILADDRESS>
</USER>
</EMPLOYEELIST>
<?xml version = "1.0"?>Ακολουθεί ένα φύλλο στυλ που παράγει ένα τεκμήριο HTML ππό το παραπάνω κέιμενο.
<?xml-stylesheet type = "text/xml"
href = "example.xsl"?>
<BOOKLIST>
<BOOK>
<TITLE>
An introduction to the saxophone
</TITLE>
<AUTHORS>
E.J. Wilson and R.Vitra
</AUTHORS>
<COMMENT>
Good introductory stuff but ignores recent
history post 1995
</COMMENT>
</BOOK>
<BOOK>
<TITLE>
The Selmer Factory
</TITLE>
<AUTHORS>
R. Logier
</AUTHORS>
<COMMENT>
The definitive work on the Selmer Factory,a
bit light on early saxophone production
</COMMENT>
</BOOK>
<BOOK>
<TITLE>
New Orleans, Jazz and the rise of Saxophone
</TITLE>
<AUTHORS>
D. Brindeck
</AUTHORS>
<COMMENT>
A popular treatment
</COMMENT>
</BOOK>
<?xml version = "1.0"?>Οι πρώτες δύο γραμμές
<?xsx:stylesheet version = "1.0" xmlns:xsl = "..">
<xsl:template match = "BOOKLIST">
<HTML>
<HEAD>
<TITLE>
Generated HTML for the book
</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match = "BOOK">
<P>
<xsl:value-f select = "TITLE"/>
</P>
</xsl:template>
<xsl:stylesheet>
<?xml version = "1.0"?>ορίζουν την χρησιμοποιούμενη έκδοση της XML και τη τοποθεσία του προτύπου φύλλου στύλ που εφαρμόζεται. Ανάμεσα στα διπλά εισαγωγικά μπορεί να βρίσκεται το κατάλληλο URL του W3 Consortium, ή μια άλλη δεύθυνση στο ενός ιστοτόπου, ή η διαδρομή καταλόγου ενός τοπικού αντιγράφου. Παρατηρείστε οτι η δεύτερη γραμμή ορίζει ένα χώρο ονομάτων, πράγμα που σημαίνει οτι όλα τα επιθέματα και οι ιδιότητες που σχετίζονται με αυτό το χώρο ονομάτων θα πρέπει να έχουν ως πρόθεμα το xsl.
<?xsx:stylesheet version = "1.0" xmlns:xsl = "..">
<xsl:template match = "BOOKLIST">καθορίζουν τις ενέργειες που εκτελούνται όταν συναντάται το επίθεμα BOOKLIST. Η επεξεργασία ορίζει οτι αρχικά παράγονται τα στοιχεία καφαλίδας ενός τεκμηρίου HTML, στη συνέχεια εφραμόζονται τα υπόλοιπα τμήματα του κώδικα, αν υπάρχει σχετική ταύτιση επιθεμάτων στο κείμενο XML, και στο τέλος παράγονται τα τελικά στοιχεία ενός τεκμηρίου HTML. Παρατηρείστε οτι η γραμμή
<HTML>
<HEAD>
<TITLE>
Generated HTML for the book
</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates/>
</BODY>
</HTML>
</xsl:template>
<xsl:apply-templates/>είναι συντομογραφία της πλήρους έκφρασης
<xsl:apply-templates>και επιτρέπεται όταν δεν υπάρχει κείμενο μεταξύ των επιθεμάτων. Το επόμενο τμήμα είναι το
</xsl:apply-templates>
<xsl:template match = "BOOK">Αυτό το τμήμα ορίζει τον μετασχηματισμό που εκτελείται όταν συναντάται το επίθεμα BOOK. Αρχικά παράγεται ένα εναρκτήριο επίθεμα παραγράφου, στη συνέχεια το κείμενο που σχετίζεται με το επίθεμα TITLE, και στο τέλος ένα ληκτικό επίθεμα παραγράφου.
<P>
<xsl:value-f select = "TITLE"/>
</P>
</xsl:template>
<HTML>Ο παρακάτω κώδικας δείχνει πώς μπορούμε να χειριστούμε τα υπόλοιπα στοιχεία της XML. Κάθε ένα από τα στοιχεία TITLE, ELEMENT, COMMENT μετασηματίζεται σε κατάλληλο κείμενο και διαχωρίζεται με ένα στοιχείο <BR>.
<HEAD>
<TITLE>
Generated HTML for the book
</TITLE>
</HEAD>
<BODY>
<P>
An introduction to the saxophone
</P>
<P>
The Selmer Factory
</P>
<P>
New Orleans, Jazz and the rise of Saxophone
</P>
</BODY>
</HTML>
<?xml version = "1.0"?>Εδώ ορίζονται τρείς ταυτίσεις. Επειδή στην ουσία είναι ίδιες αρκεί να επικεντρωθούμε σε μία.
<?xsx:stylesheet version = "1.0" xmlns:xsl = "..">
<xsl:template match = "BOOKLIST">
<HTML>
<HEAD>
<TITLE>
Generated HTML for the book
</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match = "BOOK">
<P>
<xsl:value-f select = "TITLE"/>
</P>
</xsl:template>
<xsl:template match = "BOOK/AUTHORS">
<BR>
<xsl:value-f select = "."/>
<BR>
</xsl:template>
<xsl:template match = "BOOK/COMMENT">
<BR>
<xsl:value-f select = "."/>
<BR>
</xsl:template>
<xsl:stylesheet>
<xsl:template match = "BOOK/COMMENT">¨Έχουμε ταύτιση με το στοιχείο COMMENT που είναι ένθετι στο στοιχείο BOOK. Όααν αυτή η ταύτιση συμβεί τότε παράγεται η τρέχουσα τιμή του στοιχείου (αυτό δηλώνει η τελεία) και περικλείεται από το επίθεμα <BR> της HTML.
<BR>
<xsl:value-f select = "."/>
<BR>
</xsl:template>
<HTML>Αυτή η ενότητα αποτελεί μια σύντομη εισαγωγή στην XSL. Εν τούτοις περιγράφει τις κύριες έννοιες που υποστηρίζουν αυτή τη τεχνολογία. Η XSL είναι μια πολύ μεγάλη τεχνολογία με εργαλεία ανάλογα με αυτά που βρίσκουμε στις τυπικές διαδικαστικές γλώσσες προγραμματισμού, όπως οι δηλώσεις απόφασης και επανάληψης.
<HEAD>
<TITLE>
Generated HTML for the book
</TITLE>
</HEAD>
<BODY>
<P>
An introduction to the saxophone
<BR>
E.J. Wilson and R. Vitre
<BR>
<BR>
Good introductory stuff but ignores recent history
post 1995
<BR>
</P>
...
</BODY>
</HTML>
<fo:block font-family = "sans-serif"Εδώ το κείμενο που περικλείεται από αυτό το μπλοκ ορίζεται να εμφανιστεί έντονο, με μέγεθος γραμματος 36 στιγμών, σε γραμματοσειρά sans-serif και με ύψος γραμμής 48 στιγμών.
font-weight = "bold"
font-size = "36pt"
font-height = "48pt">
..
</fo:block>