<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Extending Datalog to cover XQuery</article-title>
      </title-group>
      <contrib-group>
        <aff id="aff0">
          <label>0</label>
          <institution>Department of Software Engineering Faculty of Mathematics and Physics, Charles University Prague</institution>
        </aff>
      </contrib-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1 Introduction</title>
      <p>
        Contemporary XQuery processing and optimization
techniques are usually focused on querying and, in most cases,
ignore the existence of user-defined functions. In the era
of XSLT 1.0, the implementation techniques had to
recognize user-defined functions (templates) well (see for
instance [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]); however, this branch of research appears
discontinued as the community shifted to XQuery. The
recent development in the area of query languages for XML
shows that the XQuery language will likely be used as one
of the main application development languages in the XML
world [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. In particular, intensive use of user-defined
functions may be expected.
      </p>
      <p>
        There were several attempts to apply Datalog or
Datalog-like models to XPath or XQuery. There are also
topdown approaches using structural recursion, i.e. strongly
syntactically limited form of Horn clauses with function
symbols [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. More general forms, using first-order logic,
were also used in the area of XML constraints [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ].
      </p>
      <p>In this paper, we (informally) define the language
BTLog as an extension of Datalog. In the Section 3, an
abstraction of an XQuery program as a forest is defined. In the
fourth section, the principles of the transformation to
BTLog is defined and shown on an example. In the Section 5,
⋆ Project of the program “Information society” of the Thematic
program II of the National research program of the Czech
Republic, No. 1ET100300419
– Termination – using the T-operator, any number of
values may be generated. Therefore, termination is not
generally guaranteed and any BTLog evaluation
algorithm shall cope with termination problems.
– Minimal model semantics – without negation, minimal
model semantics works well with BTLog, just as it
works with Datalog without negation.
– Stratification – In Datalog¬, stratification is used to
extend the notion of minimal model. Similar
definition may be used in BTLog, resulting in the language
BTLog¬,strat.
– Non-stratifiable program semantics – stable model
semantics is used for non-stratified BTLog¬ programs.</p>
      <p>
        Definition of the abovementioned terms and detailed
discussion of theoretical properties of such a language may
be found for instance in [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
3
Similarly to the normative definition of the XQuery
semantics, we use (abstract) grammar rules of the core
grammar [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] as the base for the models. A XQuery program is
formalized as a forest of abstract syntax trees (AST), one
tree for each user-defined function and one for the main
expression. Each node of each AST, i.e. each sub-expression
appearing in the program, has a (program-wide) unique
address E. These addresses will participate as subscripts in
BTLog predicate names and they will also appear as
constants in some rules.
      </p>
      <p>g function toc($P) $P
h for $X</p>
      <p>$X
in</p>
      <p>return
i $P
j &lt;section&gt;
k
,
m
n $X/section
a main
b &lt;toc&gt;
c</p>
      <p>toc()
d for $S</p>
      <p>$S
in</p>
      <p>return
e doc("D")
f
$S/book
l $X/title
toc()</p>
      <p>
        Principles of the transformation
The model is based on the following principles:
– Nodes within a tree are identified by node identifiers
using Dewey ID labeling scheme. (See, for instance
[
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].)
– A tree is encoded using a mapping of Dewey labels to
node properties.
– A tree created during XQuery evaluation is identified
by a tree identifier derived from the context in which
the tree was constructed.
– A node is globally identified by the pair of a tree
identifier and a node identifier.
– A sequence (i.e. any XQuery expression value) is
modeled using a mapping of sequence identifiers to
sequence items. Since a sequence may mix atomic values
and document nodes, the mapping is divided into two
interweaved lists.
– Each sequence containing document nodes is
accompanied by a tree environment which contains the
encoding of the document trees to which the nodes of the
sequence belong.
– Evaluating a for-expression corresponds to iteration
through all sequence identifiers in the value of the
inclause.
– A particular context reached during XQuery
evaluation is identified by the pair of a call stack, containing
positions in the program code, and a control variable
stack, containing sequence identifiers selected by the
for-expressions along the call stack.
– Node identifiers, tree identifiers, sequence identifiers,
and control variable stacks share the same domain of
binary trees with values on leaves, allowing to
construct each kind of identifier from the others. In most
cases, a binary tree is used to encode a (generalized)
string – then, the rightmost path in the tree has the
length of the string and the children of the rightmost
path are the letters of the string.
4.1
      </p>
      <sec id="sec-1-1">
        <title>Model predicates</title>
        <p>Our model assigns a set of predicates to each AST node,
i.e. to each address E:
– Invocation invE (i,f ) enumerates the contexts in which
the expression E is evaluated. Argument i represents
the call stack that brought the execution to the
examined expression E. f is the stack of sequence
identifiers selected by the for-clauses throughout the
descent along i to E. The two stacks together form the
identification of the dynamic context in which an
expression is evaluated. While the XQuery standard
defines dynamic context as the set of variable
assignments (with some negligible additions), our notion of
dynamic context is based on the stack pair that
determines the descent through the code to the examined
expression, combining both the code path stored in i
and the for-control variables in f . The key to the
sufficiency of this model is the observation that the
variable assignment is a function of the stack pair.
– Atomic list alstE (i, f, s, v) represents the atomic value
portion of the assignment of the result value of the
expression E to the contexts enumerate by invE (i, f ).
s is a sequence identifier, v is a value of an atomic
type as defined by the XQuery standard. The predicate
alstE (i, f, s, v) is true if the value of the expression
E in the context (i, f ) contains the atomic value v at
position s.
– Node list nlstE (i, f, s, t, n) represents the node portion
of the result value of the expression E. The meaning of
i, f , and s is the same as in alstE . t is a tree identifier –
for external documents, it is a literal value, for
temporal trees, it is the expression T(i1, f1) corresponding
to the environment identification at the moment of tree
creation. n is a node identifier in the form of a Dewey
ID.
– Environment envE (i, t, n, a) represents the tree
environment associated to the result value of the expression
E. i determines the call context (note that the
environment is independent of the control variable stack).
t is a tree identifier, n is a node identifier, a is a
tuple of properties assigned to a node by the XML Data
Model, containing node kind, name, typed and string
values, etc. Particular properties are accessed using
predicates name(a, v), string(a, v), etc.
– valstE,$x(i, f, s, v), vnlstE,$x(i, f, s, t, n), and
venvE,$x(i,t,n,a) represent the assignment of the
values of the variable $x ∈ vars[E] to the contexts
satifying invE (i, f ). The meaning of the arguments is the
same as in alstE , nlstE , and envE .
4.2</p>
      </sec>
      <sec id="sec-1-2">
        <title>Example</title>
        <p>The following example shows the Query 1 transformed to
a BTLog program. The subscripts in the predicate names
correspond to the adresses shown in Fig. 2; unused and
identity rules were removed. The main expression of the
Query 1 transforms to the following BTLog rules:</p>
        <p>-- variable $S
inva(1, 1). -- program start
enve(i, D, n, a) :– inve(i, f ), doc(”D”, n, a).</p>
        <p>-- doc(”D”) tree environment
vnlstf,$S(i, T(s, f ), 1, t, n) :– nlsta(i, f, s, t, n).
nlstf (i, f, T(t, n), t, n) :– vnlstf,$S(i, f, s, t, m),
enve(i, t, n, T(element, book)),
child(m, n).</p>
        <p>-- $S/book node
nlstd(i, f, T(s, r), t, n) :– nlstf (i, T(s, f ), r, t, n).
vnlstg,$P(T(c, i), f, s, t, n) :– nlstd(i, f, s, t, n).</p>
        <p>-- argument $P in toc
venvg,$P(T(c, i), t, n, a) :– enve(i, t, n, a).</p>
        <p>-- environment of $P in toc
nlstc(i, f, s, t, n) :– nlstg(T(c, i), f, s, t, n).</p>
        <p>-- the return value of toc
envc(i, t, n, a) :– envg(T(c, i), t, n, a).</p>
        <p>-- the return value environment
nlstb(i, f, 1, T(i, f ), 1) :– inva(i, f ).</p>
        <p>-- the &lt;toc&gt; node
envb(i, T(i, f ), 1, T(element, toc)) :– inva(i, f ).
envb(i, T(i, f ), T(s, p), a) :– nlstc(i, f, s, t, m),
envc(i, t, n, a), cat(n, m, p).</p>
        <p>-- the &lt;toc&gt; node environment
out(i, t, n, a) :– envb(i, t, n, a).</p>
        <p>-- the output tree
The following rules correspond to the function toc:
invj(i, T(s, f )) :– vnlstg,$P(i, f, s, t, n).</p>
        <p>-- the invocation of the return clause
vnlstj,$X(i, T(s, f ), 1, t, n) :– vnlstg,$P(i, f, s, t, n).</p>
        <p>-- variable $X
nlstl(i, f, T(t, n), t, n) :– vnlstj,$X(i, f, s, t, m),
venvg,$P(i, t, n, T(element, title)),
child(m, n).</p>
        <p>-- $X/title expression
nlstn(i, f, T(t, n), t, n) :– vnlstj,$X(i, f, s, t, m),
venvg,$P(i, t, n, T(element, section)),
child(m, n).</p>
        <p>-- $X/section expression
vnlstg,$P(T(m, i), f, s, t, n) :– nlstn(i, f, s, t, n).</p>
        <p>-- argument $P in toc
venvg,$P(T(m, i), t, n, a) :– venvg,$P(i, t, n, a).</p>
        <p>-- environment of $P in toc
nlstm(i, f, s, t, n) :– nlstg(T(m, i), f, s, t, n).</p>
        <p>-- the return value of toc
envm(i, t, n, a) :– envg(T(m, i), t, n, a).</p>
        <p>-- the return value environment
nlstk(i, f, T(1, s), t, n) :– nlstl(i, f, s, t, n).
nlstk(i, f, T(2, s), t, n) :– nlstm(i, f, s, t, n).</p>
        <p>-- the concatenated value
envk(i, t, n, a) :– venvg,$P(i, t, n, a).
envk(i, t, n, a) :– envm(i, t, n, a).</p>
        <p>-- the environment of the concatenation
nlstj(i, f, 1, T(i, f ), 1) :– invj(i, f ).</p>
        <p>-- the &lt;section&gt; node
envj(i, T(i, f ), 1, T(element, toc)) :– invj(i, f ).
envj(i, T(i, f ), T(s, p), a) :– nlstk(i, f, s, t, m),
envk(i, t, n, a), cat(n, m, p).</p>
        <p>-- the &lt;section&gt; node environment
nlsth(i, f, T(s, r), t, n) :– nlstj(i, T(s, f ), r, t, n).
nlstg(i, f, s, t, n) :– nlsth(i, f, s, t, n).
envg(i, t, n, a) :– envj(i, t, n, a).</p>
        <p>-- the result of the function
-- the result environment</p>
        <p>Figure 3 show the dependence graph for the predicates
of Query 1. There are three strongly connected components
(shown in bold) – the first one carries the environment of
argument $P (i.e. the input document) down through the
recursion of the function toc. The second component
corresponds to the recursive descent of the variable $P
through the document. The third component collects the
constructed nodes back, unwinding the call stack.</p>
        <p>For Expression – E0 = for $y in Ein return Eret</p>
        <p>The for-expression generates a new dynamic context
for each member of the sequence Ein; in our model, it is
represented by pushing the sequence identifier s onto the
control stack f :</p>
        <p>invEret (i, T(s, f )) :– nlstEin (i, f, s, t, m).</p>
        <p>At the same time, the variable $y is added to the
dynamic context, defined as follows:
vnlstEret,$y(i, T(s, f ), one, t, n) :–</p>
        <p>nlstEin (i, f, s, t, n).</p>
        <p>venvEret,$y(i, t, m, a) :– envEin (i, t, m, a).</p>
        <p>For older variables, the following rules are defined for
each $x ∈ vars[E0] \ {$y}:
vnlstEret,$x(i, T(s, f ), r, u, m) :– nlstEin (i, f, s, t, n),</p>
        <p>vnlstE0,$x(i, f, r, u, m).
venvEret,$x(i, u, m, a) :– venvE0,$x(i, u, m, a).</p>
        <p>Finally, the value of the for-expression is created by the
concatenation of the return clause values:
nlstE0 (i, f, T(s, r), t, n) :– nlstEret (i, T(s, f ), r, t, n).
envE0 (i, t, n, a) :– envEret (i, t, n, a).
5</p>
        <p>Representation of Core XQuery
Operators</p>
        <p>Let Expression – E0 = let $y := Edef return Eret</p>
        <p>
          The let-expression adds the variable $y to the dynamic
context. Nevertheless, the identification of the context is
There are several variants of core subsets of XQuery, in- not changed and the other variables are also preserved.
cluding the core grammar defined in the W3C standard
[
          <xref ref-type="bibr" rid="ref9">9</xref>
          ], the LixQuery framework [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ], and others [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ]. Since the invEret (i, f ) :– invE0 (i, f ).
        </p>
        <p>
          XSLT and XQuery are related languages and the transla- vnlstEret,$y(i, f, s, t, n) :– nlstEdef (i, f, s, t, n).
tion from XSLT to XQuery is known (see [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ]), the model venvEret,$y(i, t, m, a) :– envEdef (i, t, m, a).
may be applied also to XSLT.
        </p>
        <p>Note: Most XQuery operators do not change the
assignment of variable values; therefore, we will omit the $y in Ein where
propagation rules in the subsequent description. We will
also omit the rules for alstE and valstE,$x whenever they
are similar to nlstE and vnlstE,$x.</p>
        <p>Where Clause – E0 = for
Ewh return Eret</p>
        <p>Adding where clause to a for-expression affects the set
of contexts generated for the return clause; similarly,
variable models are affected:
Function call – E0 = f( E1 )</p>
        <p>Assume that Ef is the root of the function and $x is the
name of the formal argument. The rules implement pushing
the call address E0 onto the call stack and popping it back
upon return.</p>
        <p>invEf (T(E0, i), f ) :– invE0 (i, f ).
vnlstEf ,$x(T(E0, i), f, s, t, n) :– nlstE1 (i, f, s, t, n).
venvEf ,$x(T(E0, i), t, n, a) :– envE1 (i, t, n, a).
nlstE0 (i, f, s, t, n) :– nlstEf (T(E0, i), f, s, t, n).
envE0 (i, t, n, a) :– envEf (T(E0, i), t, n, a).</p>
        <p>alstEwh (i, f, s, true).
invEret (i, T(s, f )) :– alstEwh (i, f, s, true).
vnlstEret,$y(i, T(s, f ), one, t, n) :– nlstEin (i, f, s, t, n),
vnlstEret,$x(i, T(s, f ), r, u, m) :– nlstEin (i, f, s, t, n),</p>
        <p>alstEwh (i, f, s, true), vnlstE0,$x(i, f, r, u, m).</p>
        <p>Equality Test – E0 = E1 eq E2
eqE0 (i, f ) :– alstE1 (i, f, s, v), alstE2 (i, f, r, v).
alstE0 (i, f, 1, true) :– eqE0 (i, f ).
alstE0 (i, f, 1, false) :– ¬eqE0 (i, f ).
inv[a]
env[e]
doc</p>
        <p>nlst[e]
vnlst[f,$S]
nlst[f]
nlst[d]</p>
        <p>nlst[l]
venv[g,$P]
nlst[n]</p>
        <p>vnlst[j,$X]
vnlst[g,$P]
nlst[k]
nlst[m]
nlst[g]
nlst[h]
nlst[j]
inv[j]
env[b]</p>
        <p>out
nlst[c]
env[c]</p>
        <p>env[g]
env[j]</p>
        <p>env[m]
env[k]
tree information is merged by the envE0 rules. Since the
tree identifier exactly determines the context in which the
tree was created, trees having the same identifier must be
identical; therefore, merging the tree environments do not
alter them anyway.
6</p>
      </sec>
    </sec>
    <sec id="sec-2">
      <title>Conclusion</title>
      <p>We have presented a model of XQuery evaluation based
on Horn clauses under the BTLog¬ syntax. From the
syntactic point of view, this model comprehends the
following XQuery structures: Declare function, function call,
forclause, let-clause, where-clause, stable-order-by-clause,
quantified expressions, equality operator on atomic
values, Boolean operators including negation, union,
intersection, except operators, concatenation (,)
operator, statically named document references (fn:doc),
forward/reverse axis navigation, name tests, fn:root,
and element constructors.</p>
      <p>There are two important omissions from the core
XQuery that are not covered by this model: Positional
variables and aggregate functions. There are also some flaws in
error handling, namely the fact that the model may silently
process some situations that shall be signalled as an error.
These issues will be addressed by our future research.</p>
      <p>
        The universal quantified expression (every), the
equality operator, and the node-set subtraction operator
(except) involve negation in their BTLog rules. Some
XQuery programs are not stratifiable after conversion to
BTLog¬. This is not necessarily a weakness of the
approach – since the XQuery language is Turing-complete,
we shall not expect general stratifiability. This way, the
stratifiability of its BTLog¬ equivalent may be used
as a borderline between “easy” and “difficult” cases.
Fortunately, it shows that most of the real-life XQuery programs
fall in the “easy” stratifiable category – for instance, all the
XML Query Use Cases [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] programs are stratifiable.
      </p>
      <p>Since termination in XQuery is not guaranteed, it may
be expected that it is not generally guaranteed also in
BTLog. Our future research will focus on static analysis
methods trying to discover a termination guarantee in a BTLog
program (of course, due to the Turing-completeness, no
method can decide on the existence of a termination
guarantee).</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Chamberlin</surname>
          </string-name>
          , D.:
          <article-title>XQuery: Where Do We Go from Here?</article-title>
          <source>In: XIMEP</source>
          <year>2006</year>
          , 3rd International Workshop on XQuery Implementation, Experiences and
          <string-name>
            <given-names>Perspectives. ACM Digital</given-names>
            <surname>Library</surname>
          </string-name>
          , New York (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Fokoue</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rose</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          , Sime´on, J.,
          <string-name>
            <surname>Villard</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          :
          <article-title>Compiling XSLT 2.0 into XQuery 1.0</article-title>
          . In: WWW '05
          <source>: Proceedings of the 14th International Conference on World Wide Web</source>
          , pp.
          <fpage>682</fpage>
          -
          <lpage>691</lpage>
          , ACM, New York (
          <year>2005</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Groppe</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          , Bo¨ttcher,
          <string-name>
            <given-names>S.</given-names>
            ,
            <surname>Birkenheuer</surname>
          </string-name>
          ,
          <string-name>
            <surname>G.</surname>
          </string-name>
          ,
          <article-title>Ho¨ing, A.: Reformulating XPath Queries and XSLT Queries on XSLT Views</article-title>
          .
          <source>Technical report</source>
          , University of Paderborn (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Hidders</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Michiels</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Paredaens</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vercammen</surname>
          </string-name>
          , R.:
          <article-title>LixQuery: A Formal Foundation for XQuery Research</article-title>
          . SIGMOD Rec.,
          <volume>34</volume>
          (
          <issue>4</issue>
          ):
          <fpage>21</fpage>
          -
          <lpage>26</lpage>
          , ACM, New York (
          <year>2005</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Hinrichs</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Genesereth</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <string-name>
            <given-names>Herbrand</given-names>
            <surname>Logic</surname>
          </string-name>
          .
          <source>Technical report LG-2006-02</source>
          , Stanford University (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Lu</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ling</surname>
            ,
            <given-names>T.W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chan</surname>
          </string-name>
          , C.-Y.,
          <string-name>
            <surname>Chen</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>From Region Encoding to Extended Dewey: On Efficient Processing of XML Twig Pattern Matching</article-title>
          .
          <source>In: VLDB '05: Proceedings of the 31st International Conference on Very Large Data Bases</source>
          , pp.
          <fpage>193</fpage>
          -
          <lpage>204</lpage>
          . ACM, New York (
          <year>2005</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Buneman</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fernandez</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Suciu</surname>
            ,
            <given-names>D.:</given-names>
          </string-name>
          <article-title>UnQL: A Query Language and Algebra for Semistructured Data Based on Structural Recursion In: The VLDB Journal</article-title>
          , pp.
          <fpage>76</fpage>
          -
          <lpage>110</lpage>
          , Springer-Verlag (
          <year>2000</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Bojanczyk</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>David</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Muscholl</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Schwentick</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Segoufin</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          :
          <article-title>Two-Variable Logic on Data Trees and XML Reasoning In: PODS'06</article-title>
          ,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <source>XQuery 1.0 and XPath 2</source>
          .0 Formal Semantics,
          <source>W3C</source>
          (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <given-names>XML</given-names>
            <surname>Query Use</surname>
          </string-name>
          <string-name>
            <surname>Cases</surname>
          </string-name>
          , W3C (
          <year>2007</year>
          ), http://www.w3.org/TR/xquery-use-cases/
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>