tag binds the HTML table element to the XML data island. The datasrc attribute refers to the id attribute of the data island. tags cannot be bound to data, so we are using <span> tags. The <span> tag allows the datafld attribute to refer to the XML element to be displayed. In this case, it is datafld="ARTIST" for the element and datafld="TITLE" for the <TITLE> element in the XML file. As the XML is read, additional rows are created for each element. If you are running IE 5.0 or higher, you can try it yourself. Also try this example, demonstrating , , and .
XML in Real Life: Example: XML News XMLNews is a specification for exchanging news and other information. Using such a standard makes it easier for both news producers and news consumers to produce, receive, and archive any kind of news information across different hardware, software, and programming languages. An example XMLNews document:
Colombia Earthquake 143 Dead in Colombia Earthquake By Jared Kotler, Associated Press Writer Bogota, Colombia Monday January 25 1999 7:28 ET
XML Parser: To read and update, create and manipulate an XML document, you will need an XML parser.
60
Examples Parse an XML file - Crossbrowser example This example is a cross-browser example that loads an existing XML document ("note.xml") into the XML parser. Parse an XML string - Crossbrowser example This example is a cross-browser example on how to load and parse an XML string.
Parsing XML Documents To manipulate an XML document, you need an XML parser. The parser loads the document into your computer's memory. Once the document is loaded, its data can be manipulated using the DOM. The DOM treats the XML document as a tree. To learn more about the XML DOM, please read our XML DOM tutorial. There are some differences between Microsoft's XML parser and the XML parser used in Mozilla browsers. In this tutorial we will show you how to create cross browser scripts that will work in both Internet Explorer and Mozilla browsers.
Microsoft's XML Parser Microsoft's XML parser is a COM component that comes with Internet Explorer 5 and higher. Once you have installed Internet Explorer, the parser is available to scripts. Microsoft's XML parser supports all the necessary functions to traverse the node tree, access the nodes and their attribute values, insert and delete nodes, and convert the node tree back to XML. To create an instance of Microsoft's XML parser, use the following code: JavaScript:
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); VBScript:
set xmlDoc=CreateObject("Microsoft.XMLDOM") ASP:
set xmlDoc=Server.CreateObject("Microsoft.XMLDOM") The following code fragment loads an existing XML document ("note.xml") into Microsoft's XML parser:
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.load("note.xml");
61
The first line of the script above creates an instance of the XML parser. The second line turns off asynchronized loading, to make sure that the parser will not continue execution of the script before the document is fully loaded. The third line tells the parser to load an XML document called "note.xml".
XML Parser in Mozilla, Firefox, and Opera Mozilla's XML parser supports all the necessary functions to traverse the node tree, access the nodes and their attribute values, insert and delete nodes, and convert the node tree back to XML. To create an instance of the XML parser in Mozilla browsers, use the following code: JavaScript:
var xmlDoc=document.implementation.createDocument("ns","root",null); The first parameter, ns, defines the namespace used for the XML document. The second parameter, root, is the XML root element in the XML file. The third parameter, null, is always null because it is not implemented yet. The following code fragment loads an existing XML document ("note.xml") into Mozillas' XML parser:
var xmlDoc=document.implementation.createDocument("","",null); xmlDoc.load("note.xml"); The first line of the script above creates an instance of the XML parser. The second line tells the parser to load an XML document called "note.xml".
Parsing an XML File - A Cross browser Example The following example is a cross browser example that loads an existing XML document ("note.xml") into the XML parser:
<script type="text/javascript"> var xmlDoc; function loadXML() { // code for IE if (window.ActiveXObject) { xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async=false; xmlDoc.load("note.xml"); getmessage(); } // code for Mozilla, Firefox, Opera, etc. else if (document.implementation && document.implementation.createDocument) { xmlDoc=document.implementation.createDocument("","",null); xmlDoc.load("note.xml");
62
xmlDoc.onload=getmessage; } else { alert('Your browser cannot handle this script'); } } function getmessage() { document.getElementById("to").innerHTML= xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue; document.getElementById("from").innerHTML= xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue; document.getElementById("message").innerHTML= xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue; } W3Schools Internal Note To: <span id="to"> From: <span id="from"> Message: <span id="message">
Output:
W3Schools Internal Note To: Tove From: Jani Message: Don't forget me this weekend!
Important Note To extract the text (Jani) from an XML element like: Jani , the correct syntax is:
getElementsByTagName("from")[0].childNodes[0].nodeValue IMPORTANT: getElementsByTagName returns an array of nodes. The array contains all elements with the specified name within the XML document. In this case there is only one "from" element, but you still have to specify the array index ( [0] ).
Parsing an XML String - A Cross browser Example The following code is a cross-browser example on how to load and parse an XML string:
<script type="text/javascript">
63
var text="<note>"; text=text+"Tove "; text=text+"Jani "; text=text+"Reminder "; text=text+"Don't forget me this weekend!"; text=text+""; // code for IE if (window.ActiveXObject) { var doc=new ActiveXObject("Microsoft.XMLDOM"); doc.async="false"; doc.loadXML(text); } // code for Mozilla, Firefox, Opera, etc. else { var parser=new DOMParser(); var doc=parser.parseFromString(text,"text/xml"); } // documentElement always represents the root node var x=doc.documentElement; document.write("Text of first child element: "); document.write(x.childNodes[0].childNodes[0].nodeValue); document.write(" "); document.write("Text of second child element: "); document.write(x.childNodes[1].childNodes[0].nodeValue); Output: Text of first child element: Tove Text of second child element: Jani Note: Internet Explorer uses the loadXML() method to parse an XML string, while Mozilla browsers uses the DOMParser object.
XML Namespaces: XML Namespaces provide a method to avoid element name conflicts.
Name Conflicts Since element names in XML are not predefined, a name conflict will occur when two different documents use the same element names. This XML document carries information in a table:
This XML document carries information about a table (a piece of furniture):
African Coffee Table <width>80 120
If these two XML documents were added together, there would be an element name conflict because both documents contain a element with different content and definition.
Solving Name Conflicts Using a Prefix This XML document carries information in a table:
Apples Bananas This XML document carries information about a piece of furniture:
African Coffee Table 80 120 Now there will be no name conflict because the two documents use a different name for their element ( and ). By using a prefix, we have created two different types of elements.
Using Namespaces This XML document carries information in a table:
Apples Bananas This XML document carries information about a piece of furniture:
65
African Coffee Table 80 120 Instead of using only prefixes, we have added an xmlns attribute to the tag to give the prefix a qualified name associated with a namespace.
The XML Namespace (xmlns) Attribute The XML namespace attribute is placed in the start tag of an element and has the following syntax:
xmlns:namespace-prefix="namespaceURI" When a namespace is defined in the start tag of an element, all child elements with the same prefix are associated with the same namespace. Note that the address used to identify the namespace is not used by the parser to look up information. The only purpose is to give the namespace a unique name. However, very often companies use the namespace as a pointer to a real Web page containing information about the namespace. Try to go to http://www.w3.org/TR/html4/.
Uniform Resource Identifier (URI) A Uniform Resource Identifier (URI) is a string of characters which identifies an Internet Resource. The most common URI is the Uniform Resource Locator (URL) which identifies an Internet domain address. Another, not so common type of URI is the Universal Resource Name (URN). In our examples we will only use URLs.
Default Namespaces Defining a default namespace for an element saves us from using prefixes in all the child elements. It has the following syntax:
xmlns="namespaceURI" This XML document carries information in a table:
This XML document carries information about a piece of furniture:
African Coffee Table <width>80
66
120
Namespaces in Real Use When you start using XSL, you will soon see namespaces in real use. XSL style sheets are used to transform XML documents into other formats, like HTML. If you take a close look at the XSL document below, you will see that most of the tags are HTML tags. The tags that are not HTML tags have the prefix xsl, identified by the namespace "http://www.w3.org/1999/XSL/Transform":
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> My CD Collection Title Artist <xsl:for-each select="catalog/cd"> <xsl:value-of select="title"/> <xsl:value-of select="artist"/>
XML CDATA: All text in an XML document will be parsed by the parser. Only text inside a CDATA section will be ignored by the parser.
Parsed Data XML parsers normally parse all the text in an XML document. When an XML element is parsed, the text between the XML tags is also parsed:
<message>This text is also parsed The parser does this because XML elements can contain other elements, as in this example, where the element contains two other elements (first and last):
67
Bill Gates and the parser will break it up into sub-elements like this:
Bill Gates
Escape Characters Illegal XML characters have to be replaced by entity references. If you place a character like "<" inside an XML element, it will generate an error because the parser interprets it as the start of a new element. You cannot write something like this:
<message>if salary < 1000 then To avoid this, you have to replace the "<" character with an entity reference, like this:
<message>if salary < 1000 then There are 5 predefined entity references in XML: <
<
less than
>
>
greater than
&
&
ampersand
'
'
apostrophe
"
"
quotation mark
Note: Only the characters "<" and "&" are strictly illegal in XML. Apostrophes, quotation marks and greater than signs are legal, but it is a good habit to replace them.
CDATA Everything inside a CDATA section is ignored by the parser. If your text contains a lot of "<" or "&" characters - as program code often does - the XML element can be defined as a CDATA section. A CDATA section starts with "":
<script>
68
else { return 0 } } ]]> In the example above, everything inside the CDATA section is ignored by the parser.
Notes on CDATA sections: A CDATA section cannot contain the string "]]>", therefore, nested CDATA sections are not allowed. Also make sure there are no spaces or line breaks inside the "]]>" string.
XML Encoding: XML documents may contain foreign characters, like Norwegian æ ø å , or French ê è é. To let your XML parser understand these characters, you should save your XML documents as Unicode.
Windows 2000 Notepad Windows 2000 Notepad can save files as Unicode. Save the XML file below as Unicode (note that the document does not contain any encoding attribute):
<note> Jani Tove <message>Norwegian: æøå. French: êèé The file above, note_encode_none_u.xml will NOT generate an error in IE 5+, Firefox, or Opera, but it WILL generate an error in Netscape 6.2.
Windows 2000 Notepad with Encoding Windows 2000 Notepad files saved as Unicode use "UTF-16" encoding. If you add an encoding attribute to XML files saved as Unicode, windows encoding values will generate an error. The following encoding (open it), will NOT give an error message:
69
The following encoding (open it), will NOT give an error message:
The following encoding (open it), will NOT give an error message:
The following encoding (open it), will NOT generate an error in IE 5+, Firefox, or Opera, but it WILL generate an error in Netscape 6.2.
Error Messages If you try to load an XML document into Internet Explorer, you can get two different errors indicating encoding problems: An invalid character was found in text content. You will get this error message if a character in the XML document does not match the encoding attribute. Normally you will get this error message if your XML document contains "foreign" characters, and the file was saved with a single-byte encoding editor like Notepad, and no encoding attribute was specified. Switch from current encoding to specified encoding not supported. You will get this error message if your file was saved as Unicode/UTF-16 but the encoding attribute specified a single-byte encoding like Windows-1252, ISO-8859-1 or UTF-8. You can also get this error message if your document was saved with single-byte encoding, but the encoding attribute specified a double-byte encoding like UTF-16.
Conclusion The conclusion is that the encoding attribute has to specify the encoding used when the document was saved. My best advice to avoid errors is:
• • •
Use an editor that supports encoding Make sure you know what encoding it uses Use the same encoding attribute in your XML documents
XML on the Server: XML can be generated on a server without installing any XML controls.
Storing XML on the Server XML files can be stored on an Internet server exactly the same way as HTML files.
70
Start Windows Notepad and write the following lines:
<note> Jani Tove <message>Remember me this weekend Save the file on your web server with a proper name like "note.xml".
Generating XML with ASP XML can be generated on a server without any installed XML software. To generate an XML response from the server - simply write the following code and save it as an ASP file on the web server:
<% response.ContentType="text/xml" response.Write("") response.Write("<note>") response.Write("Jani ") response.Write("Tove ") response.Write("<message>Remember me this weekend") response.Write("") %> Note that the content type of the response must be set to "text/xml". See how the ASP file will be returned from the server. If you don't know how to write ASP, please visit our ASP tutorial
Getting XML From a Database XML can be generated from a database without any installed XML software. To generate an XML database response from the server, simply write the following code and save it as an ASP file on the web server:
<% response.ContentType = "text/xml" set conn=Server.CreateObject("ADODB.Connection") conn.provider="Microsoft.Jet.OLEDB.4.0;" conn.open server.mappath("/db/database.mdb") sql="select fname,lname from tblGuestBook" set rs=Conn.Execute(sql) rs.MoveFirst() response.write("") response.write("") while (not rs.EOF) response.write("")
71
response.write("" & rs("fname") & " ") response.write("" & rs("lname") & " ") response.write(" ") rs.MoveNext() wend rs.close() conn.close() response.write(" ") %> See the real life database output from the ASP file above. The example above uses ASP with ADO. If you don't know how to use ADO, please visit our ADO tutorial.
XML Application: This chapter demonstrates a small framework for an XML application. Note: This example uses a Data Island, which only works in Internet Explorer.
The XML Example Document Look at the following XML document ("cd_catalog.xml"), that represents a CD catalog:
<TITLE>Empire Burlesque Bob Dylan USA Columbia 10.90 1985 . . ... more ... . View the full "cd_catalog.xml" file in your browser.
Load the XML Document Into a Data Island A Data Island can be used to access the XML file. To get your XML document "inside" an HTML page, add an XML Data Island to the HTML page:
<xml src="cd_catalog.xml" id="xmldso" async="false">
72
With the example code above, the XML file "cd_catalog.xml" will be loaded into an "invisible" Data Island called "xmldso". The async="false" attribute is added to make sure that all the XML data is loaded before any other HTML processing takes place.
Bind the Data Island to an HTML Table To make the XML data visible on the HTML page, you must "bind" the Data Island to an HTML element. To bind the XML data to an HTML table, add a datasrc attribute to the table element, and add datafld attributes to the span elements inside the table data:
Title Artist Year <span datafld="TITLE"> <span datafld="ARTIST"> <span datafld="YEAR">
If you have IE 5.0 or higher: See how the XML data is displayed inside an HTML table.
Bind the Data Island to <span> or Elements <span> or
elements can be used to display XML data. You don't have to use the HTML table element to display XML data. Data from a Data Island can be displayed anywhere on an HTML page. All you have to do is to add some <span> or
elements to your page. Use the datasrc attribute to bind the elements to the Data Island, and the datafld attribute to bind each element to an XML element, like this:
Title: <span datasrc="#xmldso" datafld="TITLE">
Artist: <span datasrc="#xmldso" datafld="ARTIST">
Year: <span datasrc="#xmldso" datafld="YEAR"> or like this:
Title:
Artist:
Year:
73
If you have IE 5.0 or higher: See how the XML data is displayed inside the HTML elements. Note that if you use an HTML
element, the data will be displayed on a new line. With the examples above, you will only see one line of your XML data. To navigate to the next line of data, you have to add some scripting to your code.
Add a Navigation Script Navigation has to be performed by a script. To add navigation to the XML Data Island, create a script that calls the movenext() and moveprevious() methods of the Data Island.
<script type="text/javascript"> function movenext() { x=xmldso.recordset if (x.absoluteposition < x.recordcount) { x.movenext() } } function moveprevious() { x=xmldso.recordset if (x.absoluteposition > 1) { x.moveprevious() } } If you have IE 5.0 or higher: See how you can navigate through the XML records.
All Together Now With a little creativity you can create a full application. If you use what you have learned on this page, and a little imagination, you can easily develop this into a full application. If you have IE 5.0 or higher: See how you can add a little fancy to this application.
The XMLHttpRequest Object: The XMLHttpRequest object is supported in Internet Explorer 5.0+, Safari 1.2, Mozilla 1.0 / Firefox, Opera 9, and Netscape 7.
What is an HTTP Request?
74
With an HTTP request, a web page can make a request to, and get a response from a web server without reloading the page. The user will stay on the same page, and he or she will not notice that scripts might request pages, or send data to a server in the background. By using the XMLHttpRequest object, a web developer can change a page with data from the server after the page has loaded. Google Suggest is using the XMLHttpRequest object to create a very dynamic web interface: When you start typing in Google's search box, a JavaScript sends the letters off to a server and the server returns a list of suggestions.
Is the XMLHttpRequest Object a W3C Standard? The XMLHttpRequest object is a JavaScript object, and is not specified in any W3C recommendation. However, the W3C DOM Level 3 "Load and Save" specification contains some similar functionality, but these are not implemented in any browsers yet. So, at the moment, if you need to send an HTTP request from a browser, you will have to use the XMLHttpRequest object.
Creating an XMLHttpRequest Object For Mozilla, Firefox, Safari, Opera, and Netscape:
var xmlhttp=new XMLHttpRequest() For Internet Explorer:
var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP") Example <script type="text/javascript"> var xmlhttp function loadXMLDoc(url) { xmlhttp=null // code for Mozilla, etc. if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest() } // code for IE else if (window.ActiveXObject) { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP") } if (xmlhttp!=null) { xmlhttp.onreadystatechange=state_Change xmlhttp.open("GET",url,true) xmlhttp.send(null) } else { alert("Your browser does not support XMLHTTP.")
75
} } function state_Change() { // if xmlhttp shows "loaded" if (xmlhttp.readyState==4) { // if "OK" if (xmlhttp.status==200) { // ...some code here... } else { alert("Problem retrieving XML data") } } } Try it yourself using JavaScript The syntax is a little bit different in VBScript: Try it yourself using VBScript Note: An important property in the example above is the onreadystatechange property. This property is an event handler which is triggered each time the state of the request changes. The states run from 0 (uninitialized) to 4 (complete). By having the function xmlhttpChange() check for the state changing, we can tell when the process is complete and continue only if it has been successful.
Why are we Using Async in our Examples? All the examples here use the async mode (the third parameter of open() set to true). The async parameter specifies whether the request should be handled asynchronously or not. True means that script continues to run after the send() method, without waiting for a response from the server. false means that the script waits for a response before continuing script processing. By setting this parameter to false, you run the risk of having your script hang if there is a network or server problem, or if the request is long (the UI locks while the request is being made) a user may even see the "Not Responding" message. It is safer to send asynchronously and design your code around the onreadystatechange event!
More Examples Load a textfile into a div element with XML HTTP (JavaScript) Make a HEAD request with XML HTTP (JavaScript) Make a specified HEAD request with XML HTTP (JavaScript) List data from an XML file with XML HTTP (JavaScript)
The XMLHttpRequest Object Reference
76
Methods Method
Description
abort()
Cancels the current request
getAllResponseHeaders()
Returns the complete set of http headers as a string
getResponseHeader("headername")
Returns the value of the specified http header
open("method","URL",async,"uname","pswd") Specifies the method, URL, and other optional attributes of a request The method parameter can have a value of "GET", "POST", or "PUT" (use "GET" when requesting data and use "POST" when sending data (especially if the length of the data is greater than 512 bytes. The URL parameter may be either a relative or complete URL. The async parameter specifies whether the request should be handled asynchronously or not. true means that script processing carries on after the send() method, without waiting for a response. false means that the script waits for a response before continuing script processing send(content)
Sends the request
setRequestHeader("label","value")
Adds a label/value pair to the http header to be sent
Properties Property
Description
onreadystatechange
An event handler for an event that fires at every state change
readyState
Returns the state of the object: 0 1 2 3 4
= = = = =
uninitialized loading loaded interactive complete
responseText
Returns the response as a string
responseXML
Returns the response as XML. This property returns an XML document object, which can be examined and parsed using W3C DOM node tree methods and properties
status
Returns the status as a number (e.g. 404 for "Not Found" or 200 for "OK")
statusText
Returns the status as a string (e.g. "Not Found" or "OK")
Save Data to an XML File: Usually, we save data in databases. However, if we want to make the data more portable, we can store the data in an XML file.
Create and Save an XML File
77
Storing data in XML files is useful if the data is to be sent to applications on non-Windows platforms. Remember that XML is portable across all platforms and the data will not need to be converted! First we will learn how to create and save an XML file. The XML file below will be named "test.xml" and will be stored in the c directory on the server. We will use ASP and Microsoft's XMLDOM object to create and save the XML file:
<% Dim xmlDoc, rootEl, child1, child2, p 'Create an XML document Set xmlDoc = Server.CreateObject("Microsoft.XMLDOM") 'Create a root element and append it to the document Set rootEl = xmlDoc.createElement("root") xmlDoc.appendChild rootEl 'Create and append child elements Set child1 = xmlDoc.createElement("child1") Set child2 = xmlDoc.createElement("child2") rootEl.appendChild child1 rootEl.appendChild child2 'Add an XML processing instruction 'and insert it before the root element Set p=xmlDoc.createProcessingInstruction("xml","version='1.0'") xmlDoc.insertBefore p,xmlDoc.childNodes(0) 'Save the XML file to the c directory xmlDoc.Save "c:\test.xml" %> If you open the saved XML file it will look something like this ("test.xml"):
Real Form Example Now, we will look at a real HTML form example. We will first look at the HTML form that will be used in this example: The HTML form below asks for the user's name, country, and e-mail address. This information will then be written to an XML file for storage. "customers.htm":
The action for the HTML form above is set to "saveForm.asp". The "saveForm.asp" file is an ASP page that will loop through the form fields and store their values in an XML file:
<% dim xmlDoc dim rootEl,fieldName,fieldValue,attID dim p,i 'Do not stop if an error occurs On Error Resume Next Set xmlDoc = server.CreateObject("Microsoft.XMLDOM") xmlDoc.preserveWhiteSpace=true 'Create a root element and append it to the document Set rootEl = xmlDoc.createElement("customer") xmlDoc.appendChild rootEl 'Loop through the form collection for i = 1 To Request.Form.Count 'Eliminate button elements in the form if instr(1,Request.Form.Key(i),"btn_")=0 then 'Create a field and a value element, and an id attribute Set fieldName = xmlDoc.createElement("field") Set fieldValue = xmlDoc.createElement("value") Set attID = xmlDoc.createAttribute("id") 'Set the value of the id attribute equal to the name of 'the current form field attID.Text = Request.Form.Key(i) 'Append the id attribute to the field element fieldName.setAttributeNode attID 'Set the value of the value element equal to 'the value of the current form field fieldValue.Text = Request.Form(i) 'Append the field element as a child of the root element rootEl.appendChild fieldName 'Append the value element as a child of the field element fieldName.appendChild fieldValue end if next 'Add an XML processing instruction 'and insert it before the root element Set p = xmlDoc.createProcessingInstruction("xml","version='1.0'") xmlDoc.insertBefore p,xmlDoc.childNodes(0) 'Save the XML file xmlDoc.save "c:\Customer.xml" 'Release all object references set xmlDoc=nothing set rootEl=nothing set fieldName=nothing set fieldValue=nothing set attID=nothing set p=nothing 'Test to see if an error occurred if err.number<>0 then response.write("Error: No information saved.") else response.write("Your information has been saved.")
79
end if %> Note: If the XML file name specified already exists, it will be overwritten! The XML file that will be produced by the code above will look something like this ("Customer.xml"):
<customer>
Hege Refsnes Norway [email protected]
XML DHTML Behaviors: Internet Explorer 5 introduced DHTML behaviors. Behaviors are a way to add DHTML functionality to HTML elements with the ease of CSS.
Behaviors - What are They? IE5 introduced DHTML behaviors. Behaviors are a way to add DHTML functionality to HTML elements with the ease of CSS. How do behaviors work? By using XML we can link behaviors to any element in a web page and manipulate that element. DHTML behaviors do not use a <script> tag. Instead, they are using a CSS attribute called "behavior". This "behavior" specifies a URL to an HTC file which contains the actual behavior (The HTC file is written in XML).
Syntax behavior: url(some_filename.htc) Note: The behavior attribute is only supported by IE 5 and higher, all other browsers will ignore it. This means that Mozilla, Firefox, Netscape and other browsers will only see the regular content and IE 5+ can see the DHTML behaviors.
Example The following HTML file has a <style> element that defines a behavior for the
element:
80
<style type="text/css"> h1 { behavior: url(behave.htc) } Mouse over me!!! The XML document "behave.htc" is shown below:
<script type="text/javascript"> function hig_lite() { element.style.color='red' } function low_lite() { element.style.color='blue' } The behavior file contains a JavaScript and the event handlers for the script. Try it yourself (mouse over the text in the example). The following HTML file has a <style> element that defines a behavior for elements with an id of "typing":
<style type="text/css"> #typing { behavior:url(typing.htc); font-family:'courier new'; } <span id="typing" speed="100">IE5 introduced DHTML behaviors. Behaviors are a way to add DHTML functionality to HTML elements with the ease of CSS. How do behaviors work? By using XML we can link behaviors to any element in a web page and manipulate that element.
81
The XML document "typing.htc" is shown below:
<method name="type" /> <script type="text/javascript"> var i,text1,text2,textLength,t function beginTyping() { i=0 text1=element.innerText textLength=text1.length element.innerText="" text2="" t=window.setInterval(element.id+".type()",speed) } function type() { text2=text2+text1.substring(i,i+1) element.innerText=text2 i=i+1 if (i==textLength){clearInterval(t)} } Try it yourself
XML Editors: If you are serious about XML, you will benefit from using a professional XML Editor.
XML is Text-based XML is a text-based markup language. One great thing about XML is that XML files can be created and edited using a simple text-editor like Notepad. However, when you start working with XML, you will soon find that it is better to edit XML documents using a professional XML editor.
Why Not Notepad? Many web developers use Notepad to edit both HTML and XML documents because Notepad is included with the most common OS and it is simple to use. Personally I often use Notepad for quick editing of simple HTML, CSS, and XML files. But, if you use Notepad for XML editing, you will soon run into problems. Notepad does not know that you are writing XML, so it will not be able to assist you.
Why an XML Editor?
82
Today XML is an important technology, and development projects use XML-based technologies like:
• • • • • • •
XML Schema to define XML structures and data types XSLT to transform XML data SOAP to exchange XML data between applications WSDL to describe web services RDF to describe web resources XPath and XQuery to access XML data SMIL to define graphics
To be able to write error-free XML documents, you will need an intelligent XML editor!
XML Editors Professional XML editors will help you to write error-free XML documents, validate your XML against a DTD or a schema, and force you to stick to a valid XML structure. An XML editor should be able to:
• • • • •
Add closing tags to your opening tags automatically Force you to write valid XML Verify your XML against a DTD Verify your XML against a Schema Color code your XML syntax
Altova's XMLSpy At W3Schools we have been using XMLSpy for many years. XMLSpy is our favorite XML editor. These are some of the features we especially like:
• • • • • • • • • • • • • • • • • •
Easy to use Syntax coloring Automatic tag completion Context-sensitive entry helpers Automatic well-formedness check Built in DTD and/or XML Schema-based validation Easy switching between text view and grid view Built in graphical XML Schema editor Powerful conversion utilities Database import and export Built in templates for most XML document types Built in XPath 1.0/2.0 analyzer XSLT 1.0/2.0 editor, profiler, and debugger XQuery editor, profiler, and debugger SOAP client and debugger Graphical WSDL editor Powerful project management capabilities Code generation in Java, C++, and C#
83
XML Quiz: 1. What does XML stand for? eXtra Modern Link Example Markup Language eXtensible Markup Language X-Markup Language
2. There is a way of describing XML data, how? XML uses XSL to describe data XML uses a DTD to describe the data XML uses a description node to describe data
3. XML's goal is to replace HTML False True
4. What is the correct syntax of the declaration which defines the XML version? <xml version="1.0" />
5. What does DTD stand for? Direct Type Definition Document Type Definition Do The Dance Dynamic Type Definition
6. Is this a "well formed" XML document? <note> Tove Jani Reminder Don't forget me this weekend! No
84
Yes
7. Is this a "well formed" XML document? Tove Jani Reminder Don't forget me this weekend! No Yes
8. Which statement is true? All All All All
XML elements must be lower case XML elements must be properly closed XML documents must have a DTD the statements are true
9. Which statement is true? XML documents must have a root tag XML elements must be properly nested XML tags are case sensitive All the statements are true
XML QUIZ
http://www.w3schools.com
10. XML preserves white spaces True False
11. Is this a "well formed" XML document? <note> Tove Jani No Yes
85
12. Is this a "well formed" XML document? <note> Tove Jani No Yes
13. XML elements cannot be empty False True
14. Which is not a correct name for an XML element? <1dollar> All 3 names are incorrect 15. Which is not a correct name for an XML element? All 3 names are incorrect 16. Which is not a correct name for an XML element? All 3 names are incorrect <xmldocument> <7eleven> 17. XML attribute values must always be enclosed in quotes True False
18. What does XSL stand for? eXtra Style Language eXtensible Stylesheet Language eXpandable Style Language eXtensible Style Listing 19. What is a correct way of referring to a stylesheet called "mystyle.xsl" ?
86
<stylesheet type="text/xsl" href="mystyle.xsl" />
XPath Introduction: XPath is a language for finding information in an XML document. XPath is used to navigate through elements and attributes in an XML document.
What You Should Already Know Before you continue you should have a basic understanding of the following:
87
• •
HTML / XHTML XML / XML Namespaces
If you want to study these subjects first, find the tutorials on our Home page.
What is XPath? • • • • •
XPath is a syntax for defining parts of an XML document XPath uses path expressions to navigate in XML documents XPath contains a library of standard functions XPath is a major element in XSLT XPath is a W3C Standard
XPath Path Expressions XPath uses path expressions to select nodes or node-sets in an XML document. These path expressions look very much like the expressions you see when you work with a traditional computer file system.
XPath Standard Functions XPath includes over 100 built-in functions. There are functions for string values, numeric values, date and time comparison, node and QName manipulation, sequence manipulation, Boolean values, and more.
XPath is Used in XSLT XPath is a major element in the XSLT standard. Without XPath knowledge you will not be able to create XSLT documents. You can read more about XSLT in our XSLT tutorial. XQuery and XPointer are both built on XPath expressions. XQuery 1.0 and XPath 2.0 share the same data model and support the same functions and operators. You can read more about XQuery in our XQuery tutorial.
XPath is a W3C Standard XPath became a W3C Recommendation 16. November 1999. XPath was designed to be used by XSLT, XPointer and other XML parsing software. You can read more about the XPath standard in our W3C tutorial. In XPath, there are seven kinds of nodes: element, attribute, text, namespace, processing-instruction, comment, and document (root) nodes.
88
XPath Terminology Nodes In XPath, there are seven kinds of nodes: element, attribute, text, namespace, processinginstruction, comment, and document (root) nodes. XML documents are treated as trees of nodes. The root of the tree is called the document node (or root node). Look at the following XML document:
Harry Potter J K. Rowling 2005 <price>29.99 Example of nodes in the XML document above:
(document node) J K. Rowling lang="en" (attribute node)
(element node)
Atomic values Atomic values are nodes with no children or parent. Example of atomic values:
J K. Rowling "en" Items Items are atomic values or nodes.
Relationship of Nodes Parent Each element and attribute has one parent. In the following example; the book element is the parent of the title, author, year, and price:
Harry Potter J K. Rowling 2005 <price>29.99
89
Children Element nodes may have zero, one or more children. In the following example; the title, author, year, and price elements are all children of the book element:
Harry Potter J K. Rowling 2005 <price>29.99 Siblings Nodes that have the same parent. In the following example; the title, author, year, and price elements are all siblings:
Harry Potter J K. Rowling 2005 <price>29.99 Ancestors A node's parent, parent's parent, etc. In the following example; the ancestors of the title element are the book element and the bookstore element:
Harry Potter J K. Rowling 2005 <price>29.99 Descendants A node's children, children's children, etc. In the following example; descendants of the bookstore element are the book, title, author, year, and price elements:
Harry Potter J K. Rowling
90
2005 <price>29.99
XPath uses path expressions to select nodes or node-sets in an XML document. The node is selected by following a path or steps.
The XML Example Document We will use the following XML document in the examples below.
Harry Potter <price>29.99 Learning XML <price>39.95
Selecting Nodes XPath uses path expressions to select nodes in an XML document. The node is selected by following a path or steps. The most useful path expressions are listed below: Expression
Description
nodename
Selects all child nodes of the node
/
Selects from the root node
//
Selects nodes in the document from the current node that match the selection no matter where they are
.
Selects the current node
..
Selects the parent of the current node
@
Selects attributes
Examples In the table below we have listed some path expressions and the result of the expressions: Path Expression
Result
bookstore
Selects all the child nodes of the bookstore element
/bookstore
Selects the root element bookstore Note: If the path starts with a slash ( / ) it always represents an absolute path to an element!
bookstore/book
Selects all book elements that are children of bookstore
//book
Selects all book elements no matter where they are in the document
91
bookstore//book
Selects all book elements that are descendant of the bookstore element, no matter where they are under the bookstore element
//@lang
Selects all attributes that are named lang
Predicates Predicates are used to find a specific node or a node that contains a specific value. Predicates are always embedded in square brackets.
Examples In the table below we have listed some path expressions with predicates and the result of the expressions: Path Expression
Result
/bookstore/book[1]
Selects the first book element that is the child of the bookstore element
/bookstore/book[last()]
Selects the last book element that is the child of the bookstore element
/bookstore/book[last()-1]
Selects the last but one book element that is the child of the bookstore element
/bookstore/book[position()<3]
Selects the first two book elements that are children of the bookstore element
//title[@lang]
Selects all the title elements that have an attribute named lang
//title[@lang='eng']
Selects all the title elements that have an attribute named lang with a value of 'eng'
/bookstore/book[price>35.00]
Selects all the book elements of the bookstore element that have a price element with a value greater than 35.00
/bookstore/book[price>35.00]/title
Selects all the title elements of the book elements of the bookstore element that have a price element with a value greater than 35.00
Selecting Unknown Nodes XPath wildcards can be used to select unknown XML elements. Wildcard
Description
*
Matches any element node
@*
Matches any attribute node
node()
Matches any node of any kind
Examples In the table below we have listed some path expressions and the result of the expressions: Path Expression
Result
/bookstore/*
Selects all the child nodes of the bookstore element
//*
Selects all elements in the document
92
//title[@*]
Selects all title elements which have any attribute
Selecting Several Paths By using the | operator in an XPath expression you can select several paths.
Examples In the table below we have listed some path expressions and the result of the expressions: Path Expression
Result
//book/title | //book/price
Selects all the title AND price elements of all book elements
//title | //price
Selects all the title AND price elements in the document
/bookstore/book/title | //price
Selects all the title elements of the book element of the bookstore element AND all the price elements in the document
The XML Example Document We will use the following XML document in the examples below.
Harry Potter <price>29.99 Learning XML <price>39.95
XPath Axes An axis defines a node-set relative to the current node. AxisName
Result
ancestor
Selects all ancestors (parent, grandparent, etc.) of the current node
ancestor-or-self
Selects all ancestors (parent, grandparent, etc.) of the current node and the current node itself
attribute
Selects all attributes of the current node
child
Selects all children of the current node
descendant
Selects all descendants (children, grandchildren, etc.) of the current node
descendant-or-self
Selects all descendants (children, grandchildren, etc.) of the current node and the current node itself
following
Selects everything in the document after the closing tag of the current node
93
following-sibling
Selects all siblings after the current node
namespace
Selects all namespace nodes of the current node
parent
Selects the parent of the current node
preceding
Selects everything in the document that is before the start tag of the current node
preceding-sibling
Selects all siblings before the current node
self
Selects the current node
Location Path Expression A location path can be absolute or relative. An absolute location path starts with a slash ( / ) and a relative location path does not. In both cases the location path consists of one or more steps, each separated by a slash:
An absolute location path: /step/step/... A relative location path: step/step/... Each step is evaluated against the nodes in the current node-set. A step consists of:
• • •
an axis (defines the tree-relationship between the selected nodes and the current node) a node-test (identifies a node within an axis) zero or more predicates (to further refine the selected node-set)
The syntax for a location step is:
axisname::nodetest[predicate] Examples Example
Result
child::book
Selects all book nodes that are children of the current node
attribute::lang
Selects the lang attribute of the current node
child::*
Selects all children of the current node
attribute::*
Selects all attributes of the current node
child::text()
Selects all text child nodes of the current node
child::node()
Selects all child nodes of the current node
descendant::book
Selects all book descendants of the current node
ancestor::book
Selects all book ancestors of the current node
ancestor-or-self::book
Selects all book ancestors of the current node - and the current as well if it is a book node
child::*/child::price
Selects all price grandchildren of the current node
An XPath expression returns either a node-set, a string, a Boolean, or a number.
94
XPath Operators Below is a list of the operators that can be used in XPath expressions: Operator
Description
Example
Return value
|
Computes two node-sets
//book | //cd
Returns a node-set with all book and cd elements
+
Addition
6+4
10
-
Subtraction
6-4
2
*
Multiplication
6*4
24
div
Division
8 div 4
2
=
Equal
price=9.80
true if price is 9.80 false if price is 9.90
!=
Not equal
price!=9.80
true if price is 9.90 false if price is 9.80
<
Less than
price<9.80
true if price is 9.00 false if price is 9.80
<=
Less than or equal to
price<=9.80
true if price is 9.00 false if price is 9.90
>
Greater than
price>9.80
true if price is 9.90 false if price is 9.80
>=
Greater than or equal to
price>=9.80
true if price is 9.90 false if price is 9.70
or
or
price=9.80 or price=9.70
true if price is 9.80 false if price is 9.50
and
and
price>9.00 and price<9.90
true if price is 9.80 false if price is 8.50
mod
Modulus (division remainder) 5 mod 2
1
Let's try to learn some basic XPath syntax by looking at some examples.
The XML Example Document We will use the following XML document in the examples below. "books.xml":
Everyday Italian Giada De Laurentiis 2005 <price>30.00 Harry Potter J K. Rowling 2005 <price>29.99
95
XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 <price>49.99 Learning XML Erik T. Ray 2003 <price>39.95 View the "books.xml" file in your browser.
Selecting Nodes We will use the Microsoft XMLDOM object to load the XML document and the selectNodes() function to select nodes from the XML document:
set xmlDoc=CreateObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.load("books.xml") xmlDoc.selectNodes(path expression)
Select all book Nodes The following example selects all the book nodes under the bookstore element:
xmlDoc.selectNodes("/bookstore/book") If you have IE 5 or higher you can try it yourself.
Select the First book Node The following example selects only the first book node under the bookstore element:
xmlDoc.selectNodes("/bookstore/book[0]") If you have IE 5 or higher you can try it yourself Note: IE5 and later has implemented that [0] should be the first node, but according to the W3C standard it should have been [1]!!
A Workaround! To solve the [0] and [1] problem in IE5+, you can set the SelectionLanguage to XPath.
96
The following example selects only the first book node under the bookstore element:
xmlDoc.setProperty "SelectionLanguage", "XPath" xmlDoc.selectNodes("/bookstore/book[1]") Try it yourself
Select the prices The following example selects the text from all the price nodes:
xmlDoc.selectNodes("/bookstore/book/price/text()") If you have IE 5 or higher you can try it yourself.
Selecting price Nodes with Price>35 The following example selects all the price nodes with a price higher than 35:
xmlDoc.selectNodes("/bookstore/book[price>35]/price") If you have IE 5 or higher you can try it yourself.
Selecting title Nodes with Price>35 The following example selects all the title nodes with a price higher than 35:
xmlDoc.selectNodes("/bookstore/book[price>35]/title") If you have IE 5 or higher you can try it yourself.
XPath Summary This tutorial has taught you how to find information in an XML document. You have learned how to use XPath to navigate through elements and attributes in an XML document. You have also learned how to use some of the standard functions that are built-in in XPath. For more information on XPath, please look at our XPath Reference.
Now You Know XPath, What's Next? The next step is to learn about XSLT, XQuery, XLink, and XPointer. XSLT
97
XSLT is the style sheet language for XML files. With XSLT you can transform XML documents into other formats, like XHTML. If you want to learn more about XSLT, please visit our XSLT tutorial. XQuery XQuery is about querying XML data. XQuery is designed to query anything that can appear as XML, including databases. If you want to learn more about XQuery, please visit our XQuery tutorial. XLink and XPointer Linking in XML is divided into two parts: XLink and XPointer. XLink and XPointer define a standard way of creating hyperlinks in XML documents. If you want to learn more about XLink and XPointer, please visit our XLink and XPointer tutorial.
Introduction to XSL-FO: XSL-FO is about formatting XML data for output.
What You Should Already Know Before you study XSL-FO you should have a basic understanding of XML and XML Namespaces. If you want to study these subjects first, please read our XML Tutorial.
What is XSL-FO? • • • •
XSL-FO is a language for formatting XML data XSL-FO stands for Extensible Stylesheet Language Formatting Objects XSL-FO is a W3C Recommendation XSL-FO is now formally named XSL
XSL-FO is About Formatting XSL-FO is an XML-based markup language describing the formatting of XML data for output to screen, paper or other media.
XSL-FO is Formally Named XSL Why this confusion? Is XSL-FO and XSL the same thing?
98
Yes it is, but we will give you an explanation: Styling is both about transforming and formatting information. When the World Wide Web Consortium (W3C) made their first XSL Working Draft, it contained the language syntax for both transforming and formatting XML documents. Later, the XSL Working Group at W3C split the original draft into separate Recommendations:
• • •
XSLT, a language for transforming XML documents XSL or XSL-FO, a language for formatting XML documents XPath, a language for navigating through elements and attributes in XML documents
The rest of this tutorial is about formatting XML documents: XSL-FO, also called XSL. You can read more about XSLT in our XSLT Tutorial. You can read more about XPath in our XPath Tutorial.
XSL-FO is a Web Standard XSL-FO became a W3C Recommendation 15. October 2001. Formally named XSL. To read more about the XSL activities at W3C please read our W3C Tutorial. XSL-FO documents are XML files with output information.
XSL-FO Documents XSL-FO documents are XML files with output information. They contain information about the output layout and output contents. XSL-FO documents are stored in files with a .fo or a .fob file extension. It is also quite common to see XSL-FO documents stored with an .xml extension, because this makes them more accessible to XML editors.
XSL-FO Document Structure XSL-FO documents have a structure like this:
99
Structure explained XSL-FO documents are XML documents, and must always start with an XML declaration:
The element is the root element of XSL-FO documents. The root element also declares the namespace for XSL-FO:
The element contains one or more page templates:
Each element contains a single page template. Each template must have a unique name (master-name):
One or more elements describe the page contents. The master-reference attribute refers to the simple-page-master template with the same name:
Note: The master-reference "A4" does not actually describe a predefined page format. It is just a name. You can use any name like "MyPage", "MyTemplate", etc. XSL-FO uses rectangular boxes (areas) to display output.
XSL-FO Areas The XSL formatting model defines a number of rectangular areas (boxes) to display output. All output (text, pictures, etc.) will be formatted into these boxes and then displayed or printed to a target media. We will take a closer look at the following areas:
• • • •
Pages Regions Block areas Line areas
100
•
Inline areas
XSL-FO Pages XSL-FO output is formatted into pages. Printed output will normally go into many separate pages. Browser output will often go into one long page. XSL-FO Pages contain Regions.
XSL-FO Regions Each XSL-FO Page contains a number of Regions:
• • • • •
region-body (the body of the page) region-before (the header of the page) region-after (the footer of the page) region-start (the left sidebar) region-end (the right sidebar)
XSL-FO Regions contain Block areas.
XSL-FO Block Areas XSL-FO Block areas define small block elements (the ones that normally starts with a new line) like paragraphs, tables and lists. XSL-FO Block areas can contain other Block areas, but most often they contain Line areas.
XSL-FO Line Areas XSL-FO Line areas define text lines inside Block areas. XSL-FO Line areas contain Inline areas.
XSL-FO Inline Areas XSL-FO Inline areas define text inside Lines (bullets, single character, graphics, and more). XSL-FO defines output inside elements.
XSL-FO Page, Flow, and Block "Blocks" of content "Flows" into "Pages" and then to the output media. XSL-FO output is normally nested inside elements, nested inside elements, nested inside elements:
101
XSL-FO Example It is time to look at a real XSL-FO example:
Hello W3Schools The output from this code would be something like this: Hello W3Schools
XSL-FO Flow XSL-FO pages are filled with data from elements.
102
XSL-FO Page Sequences XSL-FO uses elements to define output pages. Each output page refers to a page master which defines the layout. Each output page has a element defining the output. Each output page is printed (or displayed) in sequence.
XSL-FO Flow XSL-FO pages are filled with content from the element. The element contains all the elements to be printed to the page. When the page is full, the same page master will be used over (and over) again until all the text is printed.
Where To Flow? The element has a "flow-name" attribute. The value of the flow-name attribute defines where the content of the element will go. The legal values are:
• • • • •
xsl-region-body (into the region-body) xsl-region-before (into the region-before) xsl-region-after (into the region-after) xsl-region-start (into the region-start) xsl-region-end (into the region-end)
XSL-FO Pages: XSL-FO uses page templates called "Page Masters" to define the layout of pages.
XSL-FO Page Templates XSL-FO uses page templates called "Page Masters" to define the layout of pages. Each template must have a unique name:
103
In the example above, three elements, define three different templates. Each template (page-master) has a different name. The first template is called "intro". It could be used as a template for introduction pages. The second and third templates are called "left" and "right". They could be used as templates for even and odd page numbers.
XSL-FO Page Size XSL-FO uses the following attributes to define the size of a page:
• •
page-width defines the width of a page page-height defines the height of a page
XSL-FO Page Margins XSL-FO uses the following attributes to define the margins of a page:
• • • • •
margin-top defines the top margin margin-bottom defines the bottom margin margin-left defines the left margin margin-right defines the right margin margin defines all four margins
XSL-FO Page Regions XSL-FO uses the following elements to define the regions of a page:
• • • • •
region-body defines the body region region-before defines the top region (header) region-after defines the bottom region (footer) region-start defines the left region (left sidebar) region-end defines the right region (right sidebar)
Note that the region-before, region-after, region-start, and region-end is a part of the body region. To avoid text in the body region to overwrite text in these regions, the body region must have margins at least the size of these regions.
104
Margin Top REGION BEFORE
M a r g i n
R E G I O N
L e f t
S T A R T
REGION BODY
R E G I O N E N D
M a r g i n R i g h t
REGION AFTER Margin Bottom
XSL-FO Example This is an extract from an XSL-FO document:
The code above defines a "Simple Page Master Template" with the name "A4". The width of the page is 297 millimeters and the height is 210 millimeters.
105
The top, bottom, left, and right margins of the page are all 1 centimeter. The body has a 3 centimeter margin (on all sides). The before, after, start, and end regions (of the body) are all 2 centimeters. The width of the body in the example above can be calculated by subtracting the left and right margins and the region-body margins from the width of the page itself: 297mm - (2 x 1cm) - (2 x 3cm) = 297mm - 20mm - 60mm = 217mm. Note that the regions (region-start and region-end) are not a part of the calculation. As described earlier, these regions are parts of the body.
XSL-FO Blocks: XSL-FO output goes into blocks.
XSL-FO Pages, Flow, and Block "Blocks" of content "Flow" into "Pages" of the output media. XSL-FO output is normally nested inside elements, nested inside elements, nested inside elements:
Block Area Attributes Blocks are sequences of output in rectangular boxes:
This block of output will have a one millimeter border around it. Since block areas are rectangular boxes, they share many common area properties:
• • • •
space before and space after margin border padding space before margin
106
border padding
content
space after The space before and space after is the empty space separating the block from the other blocks. The margin is the empty area on the outside of the block. The border is the rectangle drawn around the external edge of the area. It can have different widths on all four sides. It can also be filled with different colors and background images. The padding is the area between the border and the content area. The content area contains the actual content like text, pictures, graphics, or whatever.
Block Margin • • • • •
margin margin-top margin-bottom margin-left margin-right
Block Border Border style attributes:
• • • • • • • • •
border-style border-before-style border-after-style border-start-style border-end-style border-top-style (same as border-before) border-bottom-style (same as border-after) border-left-style (same as border-start) border-right-style (same as border-end)
Border color attributes:
• • • •
border-color border-before-color border-after-color border-start-color
107
• • • • •
border-end-color border-top-color (same as border-before) border-bottom-color (same as border-after) border-left-color (same as border-start) border-right-color (same as border-end)
Border width attributes:
• • • • • • • • •
border-width border-before-width border-after-width border-start-width border-end-width border-top-width (same as border-before) border-bottom-width (same as border-after) border-left-width (same as border-start) border-right-width (same as border-end)
Block Padding • • • • • • • • •
padding padding-before padding-after padding-start padding-end padding-top (same as padding-before) padding-bottom (same as padding-after) padding-left (same as padding-start) padding-right (same as padding-end)
Block Background • • • •
background-color background-image background-repeat background-attachment (scroll or fixed)
Block Styling Attributes Blocks are sequences of output that can be styled individually:
This block of output will be written in a 12pt sans-serif font. Font attributes:
108
• • • • •
font-family font-weight font-style font-size font-variant
Text attributes:
• • • • • • • • •
text-align text-align-last text-indent start-indent end-indent wrap-option (defines word wrap) break-before (defines page breaks) break-after (defines page breaks) reference-orientation (defines text rotation in 90" increments)
Example W3Schools At W3Schools you will find all the Web-building tutorials you need, from basic HTML and XHTML to advanced XML, XSL, Multimedia and WAP. Result:
W3Schools At W3Schools you will find all the Web-building tutorials you need, from basic HTML and XHTML to advanced XML, XSL, Multimedia and WAP.
When you look at the example above, you can see that it will take a lot of code to produce a document with many headers and paragraphs. Normally XSL-FO document do not combine formatting information and content like we have done here. With a little help from XSLT we can put the formatting information into templates and write a cleaner content.
109
You will learn more about how to combine XSL-FO with XSLT templates in a later chapter in this tutorial.
XSL-FO Lists: XSL-FO uses List Blocks to define lists.
XSL-FO List Blocks There are four XSL-FO objects used to create lists:
• • • •
fo:list-block (contains the whole list) fo:list-item (contains each item in the list) fo:list-item-label (contains the label for the list-item - typically an containing a number, character, etc.) fo:list-item-body (contains the content/body of the list-item - typically one or more objects)
An XSL-FO list example:
* Volvo * Saab The output from this code would be:
* Volvo * Saab
XSL-FO Tables: XSL-FO uses the element to define tables.
110
XSL-FO Tables The XSL-FO table model is not very different from the HTML table model. There are nine XSL-FO objects used to create tables:
• • • • • • • • •
fo:table-and-caption fo:table fo:table-caption fo:table-column fo:table-header fo:table-footer fo:table-body fo:table-row fo:table-cell
XSL-FO uses the element to define a table. It contains a and an optional element. The element contains optional elements, an optional element, a element, and an optional element. Each of these elements has one or more elements, with one or more elements:
Car Price Volvo $50000 SAAB $48000
111
The output from this code would something like this: Car
Price
Volvo
$50000
SAAB
$48000
XSL-FO and XSLT: XSL-FO and XSLT can help each other.
Remember this Example? W3Schools At W3Schools you will find all the Web-building tutorials you need, from basic HTML and XHTML to advanced XML, XSL, Multimedia and WAP. Result:
W3Schools At W3Schools you will find all the Web-building tutorials you need, from basic HTML and XHTML to advanced XML, XSL, Multimedia and WAP.
The example above is from the chapter about XSL-FO Blocks.
With a Little Help from XSLT Remove the XSL-FO information from the document:
112
<paragraph> At W3Schools you will find all the Web-building tutorials you need, from basic HTML and XHTML to advanced XML, XSL, Multimedia and WAP. Add an XSLT transformation:
<xsl:template match="header"> <xsl:apply-templates/> <xsl:template match="paragraph"> <xsl:apply-templates/>
And the result will be the same:
XQuery Tutorial: The best way to explain XQuery is to say that XQuery is to XML what SQL is to database tables. XQuery is designed to query XML data - not just XML files, but anything that can appear as XML, including databases.
What You Should Already Know Before you continue you should have a basic understanding of the following:
• • •
HTML / XHTML XML / XML Namespaces XPath
If you want to study these subjects first, find the tutorials on our Home page.
113
What is XQuery? • • • • •
XQuery is the language for querying XML data XQuery for XML is like SQL for databases XQuery is built on XPath expressions XQuery is supported by all the major database engines (IBM, Oracle, Microsoft, etc.) XQuery is a W3C Recommendation
XQuery is About Querying XML XQuery is a language for finding and extracting elements and attributes from XML documents. Here is an example of a question that XQuery could solve: "Select all CD records with a price less than $10 from the CD collection stored in the XML document called cd_catalog.xml"
XQuery and XPath XQuery 1.0 and XPath 2.0 share the same data model and support the same functions and operators. If you have already studied XPath you will have no problems with understanding XQuery. You can read more about XPath in our XPath Tutorial.
XQuery - Examples of Use XQuery can be used to:
• • • •
Extract information to use in a Web Service Generate summary reports Transform XML data to XHTML Search Web documents for relevant information
Let's try to learn some basic XQuery syntax by looking at an example.
The XML Example Document We will use the following XML document in the examples below. "books.xml":
Everyday Italian Giada De Laurentiis 2005 <price>30.00
114
Harry Potter J K. Rowling 2005 <price>29.99 XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 <price>49.99 Learning XML Erik T. Ray 2003 <price>39.95 View the "books.xml" file in your browser.
How to Select Nodes From "books.xml"? Functions XQuery uses functions to extract data from XML documents. The doc() function is used to open the "books.xml" file:
doc("books.xml") Path Expressions XQuery uses path expressions to navigate through elements in an XML document. The following path expression is used to select all the title elements in the "books.xml" file:
doc("books.xml")/bookstore/book/title (/bookstore selects the bookstore element, /book selects all the book elements under the bookstore element, and /title selects all the title elements under each book element) The XQuery above will extract the following:
lang="en">Everyday Italian lang="en">Harry Potter lang="en">XQuery Kick Start lang="en">Learning XML
115
Predicates XQuery uses predicates to limit the extracted data from XML documents. The following predicate is used to select all the book elements under the bookstore element that have a price element with a value that is less than 30:
doc("books.xml")/bookstore/book[price<30] The XQuery above will extract the following:
Harry Potter J K. Rowling 2005 <price>29.99
The XML Example Document We will use the "books.xml" document in the examples below (same XML file as in the previous chapter). View the "books.xml" file in your browser.
How to Select Nodes From "books.xml" With FLWOR Look at the following path expression:
doc("books.xml")/bookstore/book[price>30]/title The expression above will select all the title elements under the book elements that are under the bookstore element that have a price element with a value that is higher than 30. The following FLWOR expression will select exactly the same as the path expression above:
for $x in doc("books.xml")/bookstore/book where $x/price>30 return $x/title The result will be:
XQuery Kick Start Learning XML With FLWOR you can sort the result:
for $x in doc("books.xml")/bookstore/book where $x/price>30 order by $x/title
116
return $x/title FLWOR is an acronym for "For, Let, Where, Order by, Return". The for clause selects all book elements under the bookstore element into a variable called $x. The where clause selects only book elements with a price element with a value greater than 30. The order by clause defines the sort-order. Will be sort by the title element. The return clause specifies what should be returned. Here it returns the title elements. The result of the XQuery expression above will be:
Learning XML XQuery Kick Start
The XML Example Document We will use the "books.xml" document in the examples below (same XML file as in the previous chapters). View the "books.xml" file in your browser.
Present the Result In an HTML List Look at the following XQuery FLWOR expression:
for $x in doc("books.xml")/bookstore/book/title order by $x return $x The expression above will select all the title elements under the book elements that are under the bookstore element, and return the title elements in alphabetical order. Now we want to list all the book-titles in our bookstore in an HTML list. We add and tags to the FLWOR expression:
{ for $x in doc("books.xml")/bookstore/book/title order by $x return {$x} } The result of the above will be:
Everyday Italian
117
Harry Potter Learning XML XQuery Kick Start Now we want to eliminate the title element, and show only the data inside the title element:
{ for $x in doc("books.xml")/bookstore/book/title order by $x return {data($x)} } The result will be (an HTML list):
Everyday Italian Harry Potter Learning XML XQuery Kick Start In XQuery, there are seven kinds of nodes: element, attribute, text, namespace, processing-instruction, comment, and document (root) nodes.
XQuery Terminology Nodes In XQuery, there are seven kinds of nodes: element, attribute, text, namespace, processinginstruction, comment, and document (root) nodes. XML documents are treated as trees of nodes. The root of the tree is called the document node (or root node). Look at the following XML document:
Harry Potter J K. Rowling 2005 <price>29.99 Example of nodes in the XML document above:
(document node) J K. Rowling lang="en" (attribute node)
(element node)
118
Atomic values Atomic values are nodes with no children or parent. Example of atomic values:
J K. Rowling "en" Items Items are atomic values or nodes.
Relationship of Nodes Parent Each element and attribute has one parent. In the following example; the book element is the parent of the title, author, year, and price:
Harry Potter J K. Rowling 2005 <price>29.99 Children Element nodes may have zero, one or more children. In the following example; the title, author, year, and price elements are all children of the book element:
Harry Potter J K. Rowling 2005 <price>29.99 Siblings Nodes that have the same parent. In the following example; the title, author, year, and price elements are all siblings:
Harry Potter J K. Rowling 2005 <price>29.99
119
Ancestors A node's parent, parent's parent, etc. In the following example; the ancestors of the title element are the book element and the bookstore element:
Harry Potter J K. Rowling 2005 <price>29.99 Descendants A node's children, children's children, etc. In the following example; descendants of the bookstore element are the book, title, author, year, and price elements:
Harry Potter J K. Rowling 2005 <price>29.99 XQuery is case-sensitive and XQuery elements, attributes, and variables must be valid XML names.
XQuery Basic Syntax Rules Some basic syntax rules:
• • • • •
XQuery is case-sensitive XQuery elements, attributes, and variables must be valid XML names An XQuery string value can be in single or double quotes An XQuery variable is defined with a $ followed by a name, e.g. $bookstore XQuery comments are delimited by (: and :), e.g. (: XQuery Comment :)
XQuery Conditional Expressions "If-Then-Else" expressions are allowed in XQuery.
120
Look at the following example:
for $x in doc("books.xml")/bookstore/book return if ($x/@category="CHILDREN") then {data($x/title)} else {data($x/title)} Notes on the "if-then-else" syntax: parentheses around the if expression are required. else is required, but it can be just else (). The result of the example above will be:
Everyday Italian Harry Potter Learning XML XQuery Kick Start
XQuery Comparisons In XQuery there are two ways of comparing values. 1. General comparisons: =, !=, <, <=, >, >= 2. Value comparisons: eq, ne, lt, le, gt, ge The difference between the two comparison methods are shown below. Look at the following XQuery expressions:
$bookstore//book/@q > 10 The expression above returns true if any q attributes have values greater than 10. $bookstore//book/@q gt 10 The expression above returns true if there is only one q attribute returned by the expression, and its value is greater than 10. If more than one q is returned, an error occurs.
121
Related Documents