Help:COAP-3180/hw4
Homework 4 - COAP 3180 Fall 2 2007
Summary
- Write some Xquery code to retrieve data from an XML collection
Part 1
- Find somewhere or create a file with some XML data (at least 1 page long)
- Write at least two different XQuery expressions to retrieve data from this file
Due: Monday Week 6
Note: Programmers who wish to play with their own XML database can download eXist from source forge. Get the latest 1.1.x-newcore version, e.g. eXist-1.1.1-newcore-build4311.jar.
To install it, type in a command window: java -jar eXist-1.1.1-newcore-build4311.jar
Part 2
- http://tecfax.unige.ch:8080/exist/ (The teacher's eXist server)
- Add an XML file to the //db/coap/coap3180 collection
- Variant A (ok for non programmers)
- Create at least two XQueries that can return some kind of HTML
- Submit them with a REST GET request
- Keep these URLs in a file and hand them over to the instructor
- Variant B
- Create a PHP script that uses the REST API or some other library (but this may turn out to be more work than you'd expect)
- Return a result in html (e.g. via php code, with a server-side XSLT stylesheet).
Due: Monday, week 7. Note: Since XML databases are relatively new technology and require Java programming knowledge for real life projects, I kept this homework as easy as I could....
Classroom activities
Use Xquery with an XML editor
- Learning how to use the XML Exchanger editor
- Launch XML Exchanger lite.
- In the left panel open all the files under xquery
- Click on the bottom tab with the books.xml file
- In the menubar select Transform->XQuery
- Note: You can find the xq file somewhere near the same place
- Repair the result file. There are some useless tags.
- Other XML examples
- Other examples files can be found on the N drive
Files from Essential XQuery - The XML Query Language
Also some more ambitious
- http://tecfa.unige.ch/guides/xml/examples/shakespeare.1.10.xml/ (various Shakespeare texts)
- http://tecfa.unige.ch/proj/seed/catalog/net/xml/catalog-eng.xml (700k DITA document)
Become somewhat familiar with eXist and its REST interface
Instructor's Web site: http://tecfax.unige.ch:8080/exist/ (Official exist web site: http://exist.sourceforge.net/index.html)
- Note: To play with these examples your firewall must not block port 8080 !
- Launch the Java Webstart client (username = coap, password will be announced)
- Add a document to the //db/coap/coap3180 collection
- Retrieve some information with the REST interface and return it with some kind of html (browser must display it)
- XPath Examples (make sure to retrieve the whole lines !)
See the slides (not distributed with an URL, since not good enough ... get them from the N: drive
Simple XPath query:
http://tecfax.unige.ch:8080/exist/rest/db/shakespeare?_query=//SPEECH[SPEAKER=%22JULIET%22]&_start=1&_howmany=10 http://demo.exist-db.org/rest/db/shakespeare?_query=//SPEECH[SPEAKER=%22JULIET%22]&_start=1&_howmany=10
- XQuery examples
Xquery returning an XML fragment (using the full URL path):
http://tecfax.unige.ch:8080/exist/rest/db/coap/cooking/dolores.xml?_query=for $t in //recipe let $name := $t//recipe_name return <name>{$name/text()} </name>
Xquery returning an XML fragment (alternative version): click
http://tecfax.unige.ch:8080/exist/rest/db/?_query=for $t in document("/db/coap/cooking/dolores.xml")//recipe let $name := $t//recipe_name return <name>{$name/text()} </name>
- Creating HTML with XQuery
Xquery returning some kind of HTML: Click
http://tecfax.unige.ch:8080/exist/rest/db/?_wrap=no&_query=<html> <body>List of names: <ul> { for $t in document("/db/coap/cooking/dolores.xml")//recipe let $name := $t//recipe_name return <li>{$name/text()} </li> } </ul></body></html>
- Applying a XSLT stylesheet to the result
By default, eXist will apply a stylesheet attached to the document to the result (therefore you'd have to modify it to cope will all sorts of query results). Alternatively you also can upload a xslt file to eXist or use one that sits on an other server:
http://tecfax.unige.ch:8080/exist/rest/db/coap/cooking/dolores2.xml?_xsl=/db/coap/cooking/result.xsl&_query=for $t in //recipe let $name := $t//recipe_name return <name>{$name/text()} </name>
Here is the code for the stylesheet "result.xsl". Note that we also declared the exist namespace, since by default eXist will wrap query results in exist:result tags
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:exist="http://exist.sourceforge.net/NS/exist" exclude-result-prefixes="exist"> <xsl:output method="html"/> <xsl:template match="/"> <html> <head><title>Query results</title></head> <body bgcolor="#FFFFFF"> <h1>Query results</h1> <ul> <xsl:apply-templates/> </ul> </body> </html> </xsl:template> <xsl:template match="//name"> <li> <xsl:apply-templates/> </li> </xsl:template> </xsl:stylesheet>
XQuery Sandboxes on the web
- Orbeon Xquery sandbox
- [1]
- Else, do these transforms with XML Exchanger light
Reading and links
Reading
Reading
- Ronald Bourret (2005). XML and Databases, http://www.rpbourret.com/xml/XMLAndDatabases.htm
- Darshan Singh, Essential XQuery - The XML Query Language, http://www.yukonxml.com/articles/xquery/ (skip the part about functions)
- XQuery http://en.wikipedia.org/wiki/XQuery (Wikipedia)
Reference
You can find additional links and more tutorials here:
- XQuery
- XQuery_tutorial - basics (no tutorial so far, just links)
- XML database
Slides
- http://tecfa.unige.ch/guides/te/files/xml-databases.pdf
- File connectivity-web-services.pdf
- Prerequisites and catchup (if needed)
- http://tecfa.unige.ch/guides/te/files/xml-intro-edit.pdf (XML Intro)
- http://tecfa.unige.ch/guides/te/files/xslt-basics.pdf (XSLT basics)
- or http://tecfa.unige.ch/guides/te/files/xml-xslt.pdf (XSLT intro)
- http://tecfa.unige.ch/guides/te/files/xml-xpath.pdf (XPath and more XSLT)
- http://tecfa.unige.ch/guides/te/files/xml-dtd.pdf (Creating DTDs)
- http://tecfa.unige.ch/guides/te/files/xml-schema.pdf (Creating XML Schemas)
- http://tecfa.unige.ch/guides/te/files/xml-ns.pdf (XML Namespaces)