caucho
Resin 1.1
FAQ
Reference
JavaDoc
Demo
Java Tutorial

Getting Started
Configuration
Servlet
JSP
XTP/XSL
JavaScript
JS Library

Core Library
File Library
Servlet Library
Database Library
XML Library

Parser
XQL
XSL
Document
Node
Element
Text
Comment
EntityRef
CData
PI
 XML Query Language (XQL)

Resin can use XQL, the XML Query Language, to select nodes from an XML tree. Scripts can select all 'table' children, or even all 'table' elements in an entire HTML file. The XQL language is exceptionally rich. It can describe an incredible number of node selections.

The XML Query Language describes nodes in an XML tree. It's a mini-language for specifying nodes patterns, like regular expressions are a mini-language for specifying text patterns.

The language selects sets of nodes. Each operator in XQL selects a new set based on the old set of nodes. For example, given a set of chapters, XQL can select all sections in those chapters, chapters with 'advanced' attributes, or grandchildren with 'color' attributes of 'blue'.

XML Query Language (XQL)
node Selects all child elements with nodeName of node.
* Selects all child elements.
@attr Selects the attribute attr.
@* Selects all attributes.
node() Matches an element node.
text() Matches a text node.
comment() Matches a comment.
pi() Matches a processing instruction node.
. Selects the current node.
.. Selects the parent of current node.
/ Selects the document node.
a[expr] Select only those nodes matching a which also satisfy the expression expr.
a[n] Selects the nth matching node matching a
a/b For each node matching a, add the nodes matching b to the result.
a//b For each node matching a, add the descendant nodes matching b to the result.
//b Returns elements in the entire document matching b.
a|b All nodes matching a or b.

XML Query Language (XQL)

node

Selects all child elements with nodeName of node.

xml = caucho.xml.Xml.parseString(@<<END);
<top>
  <a id='1'/>
  <b>
    <a id='2'/>
  </b>
  <a id='3'/>
</top>
END

top = xml.documentElement

for (var node in top.select('a'))
  writeln(node.nodeName, ': ', node.attribute.id);
a: 1
a: 3

*

Selects all child elements.

@attr

Selects the attribute attr.

chapter/@title
All title attributes of chapters.
//var[@name='keywords']/@content
The contents of all var keywords.
A web spider might use this.

@*

Selects all attributes.

node()

Matches an element node.

text()

Matches a text node.

comment()

Matches a comment.

pi()

Matches a processing instruction node.

.

Selects the current node.

The current node is primarily useful for descendant patterns. for some filter patterns.

.//image
Any image descendant.
.//image
Any image descendant.

..

Selects the parent of current node.

../brother
All brothers.
../../aunt
All aunts.
//*[../@color='blue']
All elements with blue parents.

/

Selects the document node.

Useful for finding constants in a document.

/html
The single root element.
/html/head
The HTML head section.
/html/head/var
All var tags.

a[expr]

Select only those nodes matching a which also satisfy the expression expr.

The expression b is a combination of and, or, not, comparisons and XQL patterns. An XQL expression, e.g. chapter/verse, is true if at least one node matches the pattern.

chapter[verse]
Chapters with a verse.
chapter[not(verse)]
Chapters with no verses.
chapter[not(verse) and not(section)]
Chapters with neither verses 
nor sections.
*[@color='blue']
Blue children.
*[@color='blue'][position()=last() - 1]
second to last blue child

a[n]

Selects the nth matching node matching a When a filter's expression is a number, XQL selects based on position. This special case of the filter pattern treats selections as ordered lists.

The position filter is equivalent to a[position()=n]

child[3]
third child
child/grandchild[1]
first grandchild from every child (not only the first
grandchild).
child[last()]
last child

a/b

For each node matching a, add the nodes matching b to the result.

The following is almost a definition of a/b.

for (var a in node.select('a')) {
  for (var b in a.select('b')) {
    // possible duplicates if a or b
    // are weird patterns.
  }
}
Some example interpretations,

chapter/verse
grandchildren verse with 
parent chapter.
../span
sibling span elements.
./span
children span elements.
*/*
All grandchildren.
*[color='blue']/verse
All grandchildren verse elements
with blue colored parents.
a/b/c
Great grandchildren c, with
parent b and grandparent a.

a//b

For each node matching a, add the descendant nodes matching b to the result. The '//' operator selects all descendants matching b. The '/' operator selects all children matching b.

chapter//a
All links contained in a chapter.
.//image
Any image descendant.

//b

Returns elements in the entire document matching b.

This is equivalent to /.//b, but less weird.

//image
All images in the document
//a[@href='http://www.caucho.com']
All links to caucho

a|b

All nodes matching a or b. Some example interpretations,

lion|tiger|bear
Lions and tigers and bears.


Parser   XSL
Copyright © 1998-2000 Caucho Technology. All rights reserved.
Last modified: Thu, 16 Sep 1999 14:56:49 -0700 (PDT)