Help:COAP-3180/hw4: Difference between revisions

The educational technology and digital learning wiki
Jump to navigation Jump to search
Line 59: Line 59:
* http://tecfa.unige.ch/proj/seed/catalog/net/xml/catalog-eng.xml (700k DITA document)
* http://tecfa.unige.ch/proj/seed/catalog/net/xml/catalog-eng.xml (700k DITA document)


=== Become somewhat familiar with eXist ===
=== Become somewhat familiar with eXist and its REST interface ===


Instructor's Web site:  http://tecfax.unige.ch:8080/exist/
Instructor's Web site:  http://tecfax.unige.ch:8080/exist/
Line 68: Line 68:
* Retrieve some information with the REST interface and return it with some kind of html (browser must display it)
* Retrieve some information with the REST interface and return it with some kind of html (browser must display it)


; Examples (make sure to retrieve the whole lines !)
; 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
See the slides (not distributed with an URL, since not good enough ... get them from the N: drive


Line 78: Line 78:
</pre>
</pre>


; XQuery examples
Xquery returning an XML fragment (using the full URL path):
<pre>
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>
</pre>
Xquery returning an XML fragment (alternative version): [http://tecfax.unige.ch:8080/exist/rest/db/?_query=for%20$t%20in%20document(%22/db/coap/cooking/dolores.xml%22)//recipe%20let%20$name%20:=%20$t//recipe_name%20return%20%3Cname%3E{$name/text()}%20%3C/name%3E  click]
<pre>
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>
</pre>
; Creating HTML with XQuery
Xquery returning some kind of HTML: [http://tecfax.unige.ch:8080/exist/rest/db/?_wrap=no&_query=%3Chtml%3E%20%3Cbody%3EList%20of%20names:%20%3Cul%3E%20{%20for%20$t%20in%20document(%22/db/coap/cooking/dolores.xml%22)//recipe%20let%20$name%20:=%20$t//recipe_name%20return%20%3Cli%3E{$name/text()}%20%3C/li%3E%20}%20%3C/ul%3E%3C/body%3E%3C/html%3E  Click]
Xquery returning some kind of HTML: [http://tecfax.unige.ch:8080/exist/rest/db/?_wrap=no&_query=%3Chtml%3E%20%3Cbody%3EList%20of%20names:%20%3Cul%3E%20{%20for%20$t%20in%20document(%22/db/coap/cooking/dolores.xml%22)//recipe%20let%20$name%20:=%20$t//recipe_name%20return%20%3Cli%3E{$name/text()}%20%3C/li%3E%20}%20%3C/ul%3E%3C/body%3E%3C/html%3E  Click]
<pre>
<pre>
Line 83: Line 95:
</pre>
</pre>


Xquery returning an XML fragment (using the full URL path):
; 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:
<pre>
<pre>
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>
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>
</pre>
</pre>


Xquery returning an XML fragment (alternative version): [http://tecfax.unige.ch:8080/exist/rest/db/?_query=for%20$t%20in%20document(%22/db/coap/cooking/dolores.xml%22)//recipe%20let%20$name%20:=%20$t//recipe_name%20return%20%3Cname%3E{$name/text()}%20%3C/name%3E  click]
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
<pre>
<pre>
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>
<?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>
</pre>
</pre>



Revision as of 14:21, 3 December 2007

Homework 4 - COAP 3180 Fall 2 2007

COAP 3180 Course Page

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

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

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)

  • 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>

Reading and links

Reading

Reading

Reference

You can find additional links and more tutorials here:

Slides

Prerequisites and catchup (if needed)