return to index |
xsdb project page with download links xFeedMe xsdb resources |
<context> <title> page access counts by month </title> <or> <and> <s at="page">index.html</s> <i at="month">1</i> <i at="hits">2100</i> </and> <and> <s at="page">index.html</s> <i at="month">2</i> <i at="hits">3300</i> </and> <and> <s at="page">index.html</s> <i at="month">3</i> <i at="hits">1950</i> </and> <and> <s at="page">products.html</s> <i at="month">1</i> <i at="hits">15</i> </and> <and> <s at="page">products.html</s> <i at="month">2</i> <i at="hits">650</i> </and> <and> <s at="page">products.html</s> <i at="month">3</i> <i at="hits">98</i> </and> <and> <s at="page">people.html</s> <i at="month">1</i> <i at="hits">439</i> </and> <and> <s at="page">people.html</s> <i at="month">2</i> <i at="hits">12</i> </and> <and> <s at="page">people.html</s> <i at="month">3</i> <i at="hits">665</i> </and> </or> </context>Here the first line asserts that index.html was viewed 2100 times during month 1 (January). The above format is visually similar to an html table. The "entries" in the table consist of "atomic attribute restrictions" which may be of the following forms
<s at="page">index.html</s> | Attribute page has the string value index.html. |
<id at="ssnum">111-22-3333</id> | Attribute ssnum has the string value 111-22-3333 and it's an id. |
<i at="month">11</i> | Attribute month has the integer value 11. |
<f at="width">0.334</f> | Attribute width has the floating point value 0.33. |
<a at="children"> expression </a> | Attribute children has the complex value represented by expression (see below). |
Data files such as "accesses.xsdb" may be kept on a local file system or they may also be placed on web servers to allow xsdbXML queries to query the data files using the HTTP protocol from anywhere on the Internet. (Advanced servers may also derive xsdb format information dynamically, but that is beyond the scope of the present discussion.)
<query> <consult href="accesses.xsdb"> <s at="page">index.html</s> </consult> </query>Running queries from the operating system prompt: We may run this query from the operating system prompt using the Python query.py script. The query.py script permits the literal query in the command itself
prompt> query.py --expr "<consult href='accesses.xsdb'><s at='page'>index.html</s></consult>"(note that the query tag is omitted above). This invocation generates the output
<or> <and> <i at="hits">3300</i> <i at="month">2</i> <s at="page">index.html</s> </and> <and> <i at="hits">1950</i> <i at="month">3</i> <s at="page">index.html</s> </and> <and> <i at="hits">2100</i> <i at="month">1</i> <s at="page">index.html</s> </and> </or>The query.py script also accepts a query as the contents of a file. If the contents of index_query.xsdb contains the query expression given above we may invoke the query using the file as follows
prompt> query.py index_query.xsdband the output will be similar.
The query.py program is only available when the python implementation is installed. See the Python implementation notes for details.
Graphical query interface: We may also execute queries using the graphical user interface xsdbQueryGUI.exe provided by the C-sharp/.NET implementation.
xsdbQueryGUI input screen. |
xsdbQueryGUI result display. |
xsdbXML/examples/yahoo_query.xsdb xsdbXML/examples/Accesses/totalhits_query.xsdb xsdbXML/examples/SupplierParts/supplier_query.xsdb xsdbXML/examples/BooksForSale/book_query.xsdb ...etcetera...The discussion below explains the usage of many of these queries.
<query> <consult href="accesses.xsdb"/> </query>From the user's perspective the "consult" tag is replaced by the contents of the file accesses.xsdb when the query is executed. The consultation could extract the contents of an xsdb document served by a web server by referring to a URL such as
<consult href="http://my.server.edu/data/accesses.xsdb"/>
The response to the query lists the entire contents of the table with rows listed in an arbitrary order and columns listed alphabetically by name.
<query sort="month, hits desc" names="month hits page"> <consult href="accesses.xsdb"/> </query>Above "hits desc" specifies that the hits should be ordered in descending order (instead of the default ascending order). The evaluated query gives:
<or> <and> <i at="month">1</i> <i at="hits">2100</i> <s at="page">index.html</s> </and> <and> <i at="month">1</i> <i at="hits">439</i> <s at="page">people.html</s> </and> <and> <i at="month">1</i> <i at="hits">15</i> <s at="page">products.html</s> </and> <and> <i at="month">2</i> <i at="hits">3300</i> <s at="page">index.html</s> </and> <and> <i at="month">2</i> <i at="hits">650</i> <s at="page">products.html</s> </and> <and> <i at="month">2</i> <i at="hits">12</i> <s at="page">people.html</s> </and> <and> <i at="month">3</i> <i at="hits">1950</i> <s at="page">index.html</s> </and> <and> <i at="month">3</i> <i at="hits">665</i> <s at="page">people.html</s> </and> <and> <i at="month">3</i> <i at="hits">98</i> <s at="page">products.html</s> </and> </or>
<query> <select names="month page"> <consult href="accesses.xsdb"/> </select> </query>generates the result
<or> <and> <i at="month">3</i> <s at="page">index.html</s> </and> <and> <i at="month">2</i> <s at="page">products.html</s> </and> <and> <i at="month">1</i> <s at="page">products.html</s> </and> <and> <i at="month">2</i> <s at="page">people.html</s> </and> <and> <i at="month">1</i> <s at="page">people.html</s> </and> <and> <i at="month">3</i> <s at="page">people.html</s> </and> <and> <i at="month">1</i> <s at="page">index.html</s> </and> <and> <i at="month">3</i> <s at="page">products.html</s> </and> <and> <i at="month">2</i> <s at="page">index.html</s> </and> </or>The select (and all other operations) will eliminate any duplicate rows automatically. For example the query
<query> <select names="month"> <consult href="accesses.xsdb"/> </select> </query>Only lists each month once
<or> <i at="month">1</i> <i at="month">2</i> <i at="month">3</i> </or>Note that the select operation requires all selected columns to have values by default. For example
<query> <select names="firstName lastName"> <or> <and> <s at="firstName">Joe</s> <s at="lastName">Smith</s> </and> <and> <s at="firstName">Jane</s> </and> <and> <s at="lastName">Doe</s> </and> </or> </select> </query>generates
<and> <s at="firstName">Joe</s> <s at="lastName">Smith</s> </and>where the rows with missing columns are eliminated. The undefined="true" attribute for the select tag overrides this behaviour. For example
<query> <select names="firstName lastName" undefined="true"> <or> <and> <s at="firstName">Joe</s> <s at="lastName">Smith</s> </and> <and> <s at="firstName">Jane</s> </and> <and> <s at="lastName">Doe</s> </and> </or> </select> </query>generates all rows regardless of whether columns are missing
<or> <s at="lastName">Doe</s> <s at="firstName">Jane</s> <and> <s at="firstName">Joe</s> <s at="lastName">Smith</s> </and> </or>
<query> <rename from="month page" to="MonthNumber WebPage"> <consult href="accesses.xsdb"/> </rename> </query>Changes the names "month" and "page" to "MonthNumber" and "WebPage" respectively, leaving all other names alone, producing
<or> <and> <i at="MonthNumber">3</i> <s at="WebPage">people.html</s> <i at="hits">665</i> </and> <and> <i at="MonthNumber">2</i> <s at="WebPage">people.html</s> <i at="hits">12</i> </and> ... other entries omitted ... </or>
<query> <and> <i at="month">2</i> <consult href="accesses.xsdb"/> </and> </query>generates only the rows for month 2.
<or> <and> <i at="hits">3300</i> <i at="month">2</i> <s at="page">index.html</s> </and> <and> <i at="hits">650</i> <i at="month">2</i> <s at="page">products.html</s> </and> <and> <i at="hits">12</i> <i at="month">2</i> <s at="page">people.html</s> </and> </or>The query condition can be complex. For example
<query> <and> <or> <i at="month">2</i> <i at="month">3</i> </or> <exclude> <s at="page">people.html</s> </exclude> <consult href="accesses.xsdb"/> </and> </query>Generates rows for either months 2 or 3, except for rows for the people page.
<or> <and> <i at="hits">98</i> <i at="month">3</i> <s at="page">products.html</s> </and> <and> <i at="hits">3300</i> <i at="month">2</i> <s at="page">index.html</s> </and> <and> <i at="hits">1950</i> <i at="month">3</i> <s at="page">index.html</s> </and> <and> <i at="hits">650</i> <i at="month">2</i> <s at="page">products.html</s> </and> </or>Note that positive conditions which cannot be decided are assumed to be true and appended to each row. For example
<query> <and> <i at="month">2</i> <s at="author">jim@bingo.com</s> <consult href="accesses.xsdb"/> </and> </query>Adds the assumption that the author was jim because there is no evidence to the contrary.
<or> <and> <s at="author">jim@bingo.com</s> <i at="hits">12</i> <i at="month">2</i> <s at="page">people.html</s> </and> <and> <s at="author">jim@bingo.com</s> <i at="hits">3300</i> <i at="month">2</i> <s at="page">index.html</s> </and> <and> <s at="author">jim@bingo.com</s> <i at="hits">650</i> <i at="month">2</i> <s at="page">products.html</s> </and> </or>
<query> <group at="rows" names="month"> <consult href="accesses.xsdb"/> </group> </query>producing
<or> <and> <i at="month">1</i> <a at="rows"> <or> <and> <i at="hits">439</i> <i at="month">1</i> <s at="page">people.html</s> </and> <and> <i at="hits">15</i> <i at="month">1</i> <s at="page">products.html</s> </and> <and> <i at="hits">2100</i> <i at="month">1</i> <s at="page">index.html</s> </and> </or> </a> </and> <and> <i at="month">2</i> <a at="rows"> <or> <and> <i at="hits">3300</i> <i at="month">2</i> <s at="page">index.html</s> </and> <and> <i at="hits">650</i> <i at="month">2</i> <s at="page">products.html</s> </and> <and> <i at="hits">12</i> <i at="month">2</i> <s at="page">people.html</s> </and> </or> </a> </and> <and> <i at="month">3</i> <a at="rows"> <or> <and> <i at="hits">98</i> <i at="month">3</i> <s at="page">products.html</s> </and> <and> <i at="hits">1950</i> <i at="month">3</i> <s at="page">index.html</s> </and> <and> <i at="hits">665</i> <i at="month">3</i> <s at="page">people.html</s> </and> </or> </a> </and> </or>Above, each of the three top level rows contains two columns, the month number and a rows column (tagged "a" for "aggregate") which in turn contains rows for that month. Aggregate expressions such as this are most useful for computing aggregates as demonstrated below.
<query names="month totalhits"> <and> <group at="rows" names="month"> <consult href="accesses.xsdb"/> </group> <calc at="totalhits" expr="sum(rows.hits)"/> </and> </query>Generating the result
<or> <and> <i at="month">3</i> <i at="totalhits">2713</i> </and> <and> <i at="month">1</i> <i at="totalhits">2554</i> </and> <and> <i at="month">2</i> <i at="totalhits">3962</i> </and> </or>The following query illustrates the use of the sum, min (minimum), max (maximum), avg (average), med (median) and count aggregate operations.
<query names="rows totalhits minhits maxhits avghits medhits number"> <and> <group at="rows" names="month"> <consult href="accesses.xsdb"/> </group> <calc at="totalhits" expr="sum(rows.hits)"/> <calc at="minhits" expr="min(rows.hits)"/> <calc at="maxhits" expr="max(rows.hits)"/> <calc at="avghits" expr="avg(rows.hits)"/> <calc at="medhits" expr="med(rows.hits)"/> <calc at="number" expr="count(rows.hits)"/> </and> </query>Generating the result
<or> <and> <i at="month">3</i> <i at="totalhits">2713</i> <i at="minhits">98</i> <i at="maxhits">1950</i> <f at="avghits">904.33333333333337</f> <i at="medhits">665</i> <i at="number">3</i> </and> <and> <i at="month">1</i> <i at="totalhits">2554</i> <i at="minhits">15</i> <i at="maxhits">2100</i> <f at="avghits">851.33333333333337</f> <i at="medhits">439</i> <i at="number">3</i> </and> <and> <i at="month">2</i> <i at="totalhits">3962</i> <i at="minhits">12</i> <i at="maxhits">3300</i> <f at="avghits">1320.6666666666667</f> <i at="medhits">650</i> <i at="number">3</i> </and> </or>
<query> <and> <f at="x">7.0</f> <f at="y">-8.0</f> <calc at="DistanceToOrigin" expr="sqrt(x*x+y*y)"/> <calc at="ThetaRadians" expr="atan(y/x)"/> <calc at="ThetaDegrees" expr="ThetaRadians * 180/pi()"/> </and> </query>Which produces the result
<and> <f at="DistanceToOrigin">10.63014581273465</f> <f at="ThetaDegrees">-48.814074834290352</f> <f at="ThetaRadians">-0.85196632717327203</f> <f at="x">7.0</f> <f at="y">-8.0</f> </and>Note that any calc tag should always follow declarations that establish bindings for any quantities required. For example the following does not succeed:
<query> <and> <calc at="ThetaDegrees" expr="ThetaRadians * 180/pi()"/> <f at="x">7.0</f> <f at="y">-8.0</f> <calc at="DistanceToOrigin" expr="sqrt(x*x+y*y)"/> <calc at="ThetaRadians" expr="atan(y/x)"/> </and> </query>The value for ThetaDegrees cannot be computed because the declaration for ThetaRadians does not preceed the ThetaDegrees computation. The query evaluates to the following partial result
<and weak="no exact value for attribute 'ThetaRadians'"> <f at="DistanceToOrigin">10.63014581273465</f> <f at="ThetaRadians">-0.85196632717327203</f> <f at="x">7.0</f> <f at="y">-8.0</f> </and>The "weak" attribute indicates that a computation in the derivation did not complete.
A sequence of calculations can be applied to a sequence of rows, of course, as illustrated by the following
<query> <and> <or> <and> <f at="x">7.0</f> <f at="y">-8.0</f> </and> <and> <f at="x">1.0</f> <f at="y">1.0</f> </and> <and> <f at="x">1.0</f> <f at="y">-1.0</f> </and> <and> <f at="x">-19.0</f> <f at="y">111.0</f> </and> <and> <f at="x">1.0</f> <f at="y">0</f> </and> </or> <calc at="DistanceToOrigin" expr="sqrt(x*x+y*y)"/> <calc at="ThetaRadians" expr="atan(y/x)"/> <calc at="ThetaDegrees" expr="ThetaRadians * 180/pi()"/> </and> </query>Which generates
<or> <and> <f at="DistanceToOrigin">10.63014581273465</f> <f at="ThetaDegrees">-48.814074834290352</f> <f at="ThetaRadians">-0.85196632717327203</f> <f at="x">7.0</f> <f at="y">-8.0</f> </and> <and> <f at="DistanceToOrigin">1.4142135623730951</f> <f at="ThetaDegrees">45.0</f> <f at="ThetaRadians">0.78539816339744828</f> <f at="x">1.0</f> <f at="y">1.0</f> </and> <and> <f at="DistanceToOrigin">1.4142135623730951</f> <f at="ThetaDegrees">-45.0</f> <f at="ThetaRadians">-0.78539816339744828</f> <f at="x">1.0</f> <f at="y">-1.0</f> </and> <and> <f at="DistanceToOrigin">112.61438629233834</f> <f at="ThetaDegrees">-80.286748975059723</f> <f at="ThetaRadians">-1.4012681153369748</f> <f at="x">-19.0</f> <f at="y">111.0</f> </and> <and> <f at="DistanceToOrigin">1.0</f> <f at="ThetaDegrees">0.0</f> <f at="ThetaRadians">0.0</f> <f at="x">1.0</f> <f at="y">0.0</f> </and> </or>
<query> <and> <or> <i at="N">10</i> <i at="N">13</i> <i at="N">14</i> <i at="N">17</i> <i at="N">19</i> <i at="N">20</i> </or> <cond expr="N%2==0"/> </and> </query>chooses the values for N that are divisible by 2:
<or> <i at="N">10</i> <i at="N">20</i> <i at="N">14</i> </or>Like the calc function the cond predicate must follow bindings for any values required by the condition.
+ - * / & % == < > <= >=as well as the aggregate functions mentioned above, functions from the python math and string modules such as
sin(x) log(x) find(string, substring)where constants are written as functions with no arguments, such as
e() pi() letters()Also provided are the builtin functions
int(x) float(x) str(x) round(x) abs(x)
<query> <and> <i at="N"><lt>15</lt></i> <or> <i at="N">10</i> <i at="N">13</i> <i at="N">14</i> <i at="N">17</i> <i at="N">19</i> <i at="N">20</i> </or> </and> </query>Generating the result
<or> <i at="N">10</i> <i at="N">13</i> <i at="N">14</i> </or>The following special conditions may be used with strings or numbers
<i at="N"><lt>15</lt></i> -- N is less than 15 <i at="N"><gt>15</gt></i> -- N is greater than 15 <i at="N"><le>15</le></i> -- N is less than or equal to 15 <i at="N"><ge>15</ge></i> -- N is greater than or equal to 15Strings also may be used with the prefix special condition
<s at="City">Chi</s> -- City has "chi" as a prefix
<query> <ungroup at="students"> <or> <and> <s at="instructor">Fischman</s> <a at="students"> <or> <s at="student">Jim</s> <s at="student">Sally</s> <s at="student">Bob</s> </or> </a> </and> <and> <s at="instructor">Bader</s> <a at="students"> <or> <s at="student">John</s> <s at="student">Lisa</s> </or> </a> </and> <and> <s at="instructor">Wilk</s> <a at="students"> <nothing/> </a> </and> </or> </ungroup> </query>The above query ungroups the students to associate them with the appropriate instructor. The result is
<or> <and> <s at="instructor">Fischman</s> <s at="student">Sally</s> </and> <and> <s at="instructor">Bader</s> <s at="student">Lisa</s> </and> <and> <s at="instructor">Bader</s> <s at="student">John</s> </and> <and> <s at="instructor">Fischman</s> <s at="student">Jim</s> </and> <and> <s at="instructor">Fischman</s> <s at="student">Bob</s> </and> </or>Note that the instructor Wilk vanishes because there is no associated student.
<context> <title> some women </title> <or> <s at="name">Jane</s> <s at="name">Wendy</s> <s at="name">Sandra</s> <s at="name">Tess</s> <s at="name">Lisa</s> </or> </context>and kids.xsdb contains
<context> <title> Moms and children </title> <or> <and> <s at="mom">Wendy</s> <s at="kid">Jane</s> </and> <and> <s at="mom">Wendy</s> <s at="kid">Bob</s> </and> <and> <s at="mom">Wendy</s> <s at="kid">Sandra</s> </and> <and> <s at="mom">Sandra</s> <s at="kid">Lisa</s> </and> <and> <s at="mom">Sandra</s> <s at="kid">Bill</s> </and> <and> <s at="mom">Tess</s> <s at="kid">Peter</s> </and> <and> <s at="mom">Lisa</s> <s at="kid">Waldo</s> </and> </or> </context>Below we discuss a number of queries combining these two tables.
<query names="name kids"> <title>women with their kids (even if there aren't any)</title> <and> <consult href="women.xsdb"/> <subquery at="kids" names="name"> <rename to="name" from="mom"> <consult href="kids.xsdb"/> </rename> </subquery> </and> </query>Note that the rename operation makes the name column in women.xsdb match the mom column in kids.xsdb. Furthermore the names="name" clause specifies that the "name" column from the outer query is needed for the inner query. The result of this query gives
<or> <and> <s at="name">Jane</s> <a at="kids"> <nothing/> </a> </and> <and> <s at="name">Lisa</s> <a at="kids"> <and> <s at="kid">Waldo</s> <s at="name">Lisa</s> </and> </a> </and> <and> <s at="name">Tess</s> <a at="kids"> <and> <s at="kid">Peter</s> <s at="name">Tess</s> </and> </a> </and> <and> <s at="name">Wendy</s> <a at="kids"> <or> <and> <s at="kid">Sandra</s> <s at="name">Wendy</s> </and> <and> <s at="kid">Bob</s> <s at="name">Wendy</s> </and> <and> <s at="kid">Jane</s> <s at="name">Wendy</s> </and> </or> </a> </and> <and> <s at="name">Sandra</s> <a at="kids"> <or> <and> <s at="kid">Bill</s> <s at="name">Sandra</s> </and> <and> <s at="kid">Lisa</s> <s at="name">Sandra</s> </and> </or> </a> </and> </or>Here each woman is group with her children, including Jane who is grouped with no children. We can derive from this query aggregate reports such as women and the number of children they have
<query names="name nkids"> <title>women with number of children</title> <and> <consult href="women.xsdb"/> <subquery at="kids" names="name"> <rename to="name" from="mom"> <consult href="kids.xsdb"/> </rename> </subquery> <calc at="nkids" expr="count(kids.kid)"/> </and> </query>With the result
<or> <and> <s at="name">Lisa</s> <i at="nkids">1</i> </and> <and> <s at="name">Jane</s> <i at="nkids">0</i> </and> <and> <s at="name">Wendy</s> <i at="nkids">3</i> </and> <and> <s at="name">Sandra</s> <i at="nkids">2</i> </and> <and> <s at="name">Tess</s> <i at="nkids">1</i> </and> </or>Notice that Jane appears in this query result with a count of zero children.
<query> <or> <consult href="women.xsdb"/> <select names="name"> <rename from="mom" to="name"> <consult href="kids.xsdb"/> </rename> </select> <select names="name"> <rename from="kid" to="name"> <consult href="kids.xsdb"/> </rename> </select> </or> </query>which produces the result
<or> <s at="name">Waldo</s> <s at="name">Bill</s> <s at="name">Wendy</s> <s at="name">Sandra</s> <s at="name">Jane</s> <s at="name">Lisa</s> <s at="name">Bob</s> <s at="name">Peter</s> <s at="name">Tess</s> </or>
<query> <and> <select names="name"> <rename from="mom" to="name"> <consult href="kids.xsdb"/> </rename> </select> <select names="name"> <rename from="kid" to="name"> <consult href="kids.xsdb"/> </rename> </select> </and> </query>which produces the result
<or> <s at="name">Lisa</s> <s at="name">Sandra</s> </or>
<query names="grandmother mom kid"> <and> <rename from="mom kid" to="grandmother mom"> <consult href="kids.xsdb"/> </rename> <consult href="kids.xsdb"/> </and> </query>Here the conjunctions will match only where a kid is also a mom. This produces the result
<or> <and> <s at="grandmother">Sandra</s> <s at="mom">Lisa</s> <s at="kid">Waldo</s> </and> <and> <s at="grandmother">Wendy</s> <s at="mom">Sandra</s> <s at="kid">Lisa</s> </and> <and> <s at="grandmother">Wendy</s> <s at="mom">Sandra</s> <s at="kid">Bill</s> </and> </or>
<query> <consult href="kids.xsdb"/> <exclude> <rename from="name" to="kid"> <consult href="women.xsdb"/> </rename> </exclude> </query>This query produces the result
<or> <and> <s at="kid">Waldo</s> <s at="mom">Lisa</s> </and> <and> <s at="kid">Bob</s> <s at="mom">Wendy</s> </and> <and> <s at="kid">Peter</s> <s at="mom">Tess</s> </and> <and> <s at="kid">Bill</s> <s at="mom">Sandra</s> </and> </or>It is important that exclusions only include relevant information, since a row is excluded only if it matches every column in an exclusion. For example the following query WILL NOT determine the women who are not moms.
<query> <and> <consult href="women.xsdb"/> <exclude> <rename from="mom" to="name"> <consult href="kids.xsdb"/> </rename> </exclude> </and> </query>This produces the result
<or weak="unresolved exclusions omitted from query result"> <s at="name">Jane</s> <s at="name">Lisa</s> <s at="name">Sandra</s> <s at="name">Wendy</s> <s at="name">Tess</s> </or>where the "weak" mark indicates that some negative information was omitted from the query result but not logically eliminated. To fix this query we must only include the mom column from the kids.xsdb table within the exclusion as follows
<query> <and> <consult href="women.xsdb"/> <exclude> <rename from="mom" to="name"> <select names="mom"> <consult href="kids.xsdb"/> </select> </rename> </exclude> </and> </query>This query produces the result
<s at="name">Jane</s>
<query names="grandmother mom kid"> <name bookmark="k"> <consult href="kids.xsdb"/> </name> <and> <rename from="mom kid" to="grandmother mom"> <reference bookmark="k"/> </rename> <reference bookmark="k"/> </and> </query>Here the name tag defines the bookmark "k" to refer to the contents of kids.xsdb and the two reference tags make use of the bookmark. The bookmark feature is both a convenience to save typing and an optimization, since in many cases the content of a bookmark will only be evaluated once even if it is used many times.
<nothing/> | Empty result. |
<anything/> | Unrestricted result. |
<s at="page">index.html</s> | Attribute page has the string value index.html. |
<id at="ssnum">111-22-3333</id> | Attribute ssnum has the string value 111-22-3333 and it's an id. |
<i at="month">11</i> | Attribute month has the integer value 11. |
<f at="width">0.334</f> | Attribute width has the floating point value 0.33. |
<and> E1 E2 E3 </and> | Conjunction of assertions E1 E2 E3 |
<or> E1 E2 E3 </or> | Disjunction of assertions E1 E2 E3 |
<exclude> E </exclude> | Exclude patterns matching E. |
<rename from="A B C" to="X Y Z"> expression </rename> | rename attributes A B C to X Y Z in expression. |
<select names="A B C" [undefined="true"]> expression </select> | Keep only names "A B C" [allow nulls] from expression |
<object id="123"> TEXT </id> | Associate the identity "123" with the TEXT. |
<object id="123" href="URL"/> | Associate the identity "123" with the contents of the URL. |
<name bookmark="X"> expression </name> | Associate the bookmark X with the expression. |
<reference bookmark="X"/> | Use the expression associated with bookmark X here. |
<fn name="f" at="x" args="abc"/> | Assign to attribute x the value of evaluating function f with arguments abc in the current context. |
<pred name="p" args="abc"> expression </pred> | Evaluate predicate p with arguments abc over the expression within the current context. |
<consult href="URL"> expression </consult>
<consult href="URL"/> |
Substitute the contents of URL here [conjoined with expression]. |
<group at="X" names="A B C"> expression </group> | Group by attributes A B C and assign groupings to attribute X. |
<ungroup at="X"> expression </ungroup> | Ungroup attribute X. |
<cond expr="boolean expression"> expression </cond> | Evaluate the boolean expression for the result of expression. |
<calc at="X" expr="algebraic expression"/> | Evaluate the algebraic expression in the current context. |
<subquery at="X" names="A B"> expression </subquery> | Evaluate the subquery, importing the names A and B from the outer context. Store the result in attribute X. |