
XQuery has an extensive collection of built-in functions that are described in detail at http://www.w3.org/TR/xpath-functions/. You have already come across some functions like document(), in some other examples on this site. Here are a few more:
{-- String function - concat() --}
<result>
<concat>{concat('abc', 'def')}</concat>
<concat>{concat('abc', 'def', 'ghi', 'jkl', 'mno')}</concat>
</result>
{-- compare two strings --}
<compare>
<case>{compare('abc', 'abc')}</case>
<case>{compare('Strasse', 'Straße')}</case>
<case>{compare('Strassen', 'Straße')}</case>
</compare>
{-- demonstrate the contains() function for substring
matching --}
<contains>
<result>{contains("now is the time", "is t")}</result>
</contains>
{-- aggregate functions in the XQuery function library --}
<aggregate>
<count>{count((<one>1</one>, <two>2</two>))}</count>
<avg>{avg((1,2,6))}</avg>
<max>{max((1,2,6))}</max>
<min>{min((1,2,6))}</min>
<sum>{sum((1,2,6))}</sum>
</aggregate>
{-- demonstrates the copy function that does a deep copy of
its argument --}
let $v := (<family name='gan'> <father>peter</father></family>)
return ( copy($v) )
{-- xf:deep-equal --}
let $n1 :=
<root>
<element1 a1="123" a2="456">
<element1.1 a1="abc" a2="def">hello</element1.1>
</element1>
<element2 a1="123" a2="456">
<element2.1 a1="abc" a2="def">
<element2.1.1>world</element2.1.1>
</element2.1>
</element2>
</root>
{-- $n2 is same as $n1 --}
let $n2 :=
<root>
<element1 a1="123" a2="456">
<element1.1 a1="abc" a2="def">hello</element1.1>
</element1>
<element2 a1="123" a2="456">
<element2.1 a1="abc" a2="def">
<element2.1.1>world</element2.1.1>
</element2.1>
</element2>
</root>
{-- $n3 does not have <element2.1.1> --}
let $n3 :=
<root>
<element1 a1="123" a2="456">
<element1.1 a1="abc" a2="def">hello</element1.1>
</element1>
<element2 a1="123" a2="456">
<element2.1 a1="abc" a2="def">
</element2.1>
</element2>
</root>
{-- $n4 has one more attribute for <element2.1> --}
let $n4 :=
<root>
<element1 a1="123" a2="456">
<element1.1 a1="abc" a2="def">hello</element1.1>
</element1>
<element2 a1="123" a2="456">
<element2.1 a1="abc" a2="def" a3="BAD">
<element2.1.1>world</element2.1.1>
</element2.1>
</element2>
</root>
{-- $n5 has one less attribute for <element2> --}
let $n5 :=
<root>
<element1 a1="123" a2="456">
<element1.1 a1="abc" a2="def">hello</element1.1>
</element1>
<element2 a1="123">
<element2.1 a1="abc" a2="def">
<element2.1.1>world</element2.1.1>
</element2.1>
</element2>
</root>
{-- $n6 has one more element <element3> --}
let $n6 :=
<root>
<element1 a1="123" a2="456">
<element1.1 a1="abc" a2="def">hello</element1.1>
</element1>
<element2 a1="123" a2="456">
<element2.1 a1="abc" a2="def">
<element2.1.1>world</element2.1.1>
</element2.1>
</element2>
<element3>BAD</element3>
</root>
{-- $n7 has one less element <element2> --}
let $n7 :=
<root>
<element1 a1="123" a2="456">
<element1.1 a1="abc" a2="def">hello</element1.1>
</element1>
</root>
{-- $n8 has comment --}
let $n8 :=
<root>
<element1 a1="123" a2="456">
<element1.1 a1="abc" a2="def">hello</element1.1>
</element1>
<!-- some comment -->
<element2 a1="123" a2="456">
<element2.1 a1="abc" a2="def">
<element2.1.1>world</element2.1.1>
</element2.1>
</element2>
</root>
{-- $n9 has different element text value --}
let $n9 :=
<root>
<element1 a1="123" a2="456">
<element1.1 a1="abc" a2="def">hello</element1.1>
</element1>
<element2 a1="123" a2="456">
<element2.1 a1="abc" a2="def">
<element2.1.1>BAD</element2.1.1>
</element2.1>
</element2>
</root>
{-- $n10 has different attr text value --}
let $n10 :=
<root>
<element1 a1="123" a2="456">
<element1.1 a1="abc" a2="def">hello</element1.1>
</element1>
<element2 a1="123" a2="456">
<element2.1 a1="abc" a2="BAD">
<element2.1.1>world</element2.1.1>
</element2.1>
</element2>
</root>
return
<result>
<n1>{$n1}</n1>
<n2>{$n2}</n2>
<n3>{$n3}</n3>
<n4>{$n4}</n4>
<n5>{$n5}</n5>
<n6>{$n6}</n6>
<n7>{$n7}</n7>
<n8>{$n8}</n8>
<n9>{$n9}</n9>
<n10>{$n10}</n10>
<check>n1 and n1</check>
<case>
{
if (deep-equal($n1, $n1)) then "Equal" else "Not Equal"
}
</case>
<check>n1 and n2</check>
<case>
{
if (deep-equal($n1, $n2)) then "Equal" else "Not Equal"
}
</case>
<check>n1 and n3</check>
<case>
{
if (deep-equal($n1, $n3)) then "Equal" else "Not Equal"
}
</case>
<check>n1 and n4</check>
<case>
{
if (deep-equal($n1, $n4)) then "Equal" else "Not Equal"
}
</case>
<check>n1 and n5</check>
<case>
{
if (deep-equal($n1, $n5)) then "Equal" else "Not Equal"
}
</case>
<check>n1 and n6</check>
<case>
{
if (deep-equal($n1, $n6)) then "Equal" else "Not Equal"
}
</case>
<check>n1 and n7</check>
<case>
{
if (deep-equal($n1, $n7)) then "Equal" else "Not Equal"
}
</case>
<check>n1 and n8</check>
<case>
{
if (deep-equal($n1, $n8)) then "Equal" else "Not Equal"
}
</case>
<check>n1 and n9</check>
<case>
{
if (deep-equal($n1, $n9)) then "Equal" else "Not Equal"
}
</case>
<check>n1 and n10</check>
<case>
{
if (deep-equal($n1, $n10)) then "Equal" else "Not Equal"
}
</case>
</result>
{-- distinct-nodes() (equality based on node identity) --}
let $n1 := <n1/>
let $n2 := <n2/>
let $seq1 := (<n1/>, <n2/>, $n1, $n2)
let $seq2 := ($n1, $n2, $n1, $n2, $n1, $n2)
let $seq3 := ()
let $ds1 := distinct-nodes($seq1)
let $ds2 := distinct-nodes($seq2)
let $ds3 := distinct-nodes($seq3)
return
<result>
<test>
<seq>{$seq1}</seq>
<distinct-seq>{$ds1}</distinct-seq>
</test>
<test>
<seq>{$seq2}</seq>
<distinct-seq>{$ds2}</distinct-seq>
</test>
<test>
<seq>{$seq3}</seq>
<distinct-seq>{$ds3}</distinct-seq>
</test>
</result>
{-- demonstrates the use of distinct-values() --}
{-- node sequences --}
let $n1 := <n1><n11>foo</n11></n1>
let $n2 := <n2><n22>bar</n22></n2>
let $seq1 := (<n1><n11>foo</n11></n1>, <n2><n22>bar</n22></n2>, $n1, $n2)
let $seq2 := ($n1, $n2, $n1, $n2, $n1, $n2)
let $seq3 := ()
let $ds1 := distinct-values($seq1)
let $ds2 := distinct-values($seq2)
let $ds3 := distinct-values($seq3)
{-- simple value sequences --}
let $vseq1 := (1, 2, 1, 2, 3, 4, 1, 3)
let $vseq2 := ("foo", "bar", "Foo", "Bar", "foo", "bar")
let $vseq3 := (100, "100", integer("100"), -123, "-123", integer("-123"))
let $vseq4 := (
dateTime("2002-08-18T12:34:56"), "2002-08-18T12:34:56",
dateTime("2002-08-18T12:34:56"),
date("2002-08-18"), "2002-08-18", date("2002-08-18"),
time("12:34:56"), "12:34:56", time("12:34:56"))
let $vds1 := distinct-values($vseq1)
let $vds2 := distinct-values($vseq2)
let $vds3 := distinct-values($vseq3)
let $vds4 := distinct-values($vseq4)
return
<result>
<node-seq>
<distinct-seq1>{$ds1}</distinct-seq1>
<distinct-seq2>{$ds2}</distinct-seq2>
<distinct-seq3>{$ds3}</distinct-seq3>
</node-seq>
<simple-seq>
<distinct-seq1>{$vds1}</distinct-seq1>
<distinct-seq2>{$vds2}</distinct-seq2>
<distinct-seq3>{$vds3}</distinct-seq3>
<distinct-seq4>{$vds4}</distinct-seq4>
</simple-seq>
</result>