XML Query Language/Beispiele: Unterschied zwischen den Versionen
aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Kowa (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Kowa (Diskussion | Beiträge) |
||
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
=Beispiele= | ==Beispiele== | ||
Die folgenden [[XML Query Language|XQuery]]-Beispiele wurden mit http://ahnen.multimedia.fh-augsburg.de:8080/exist/xmldb/db/ getestet. | Die folgenden [[XML Query Language|XQuery]]-Beispiele wurden mit http://ahnen.multimedia.fh-augsburg.de:8080/exist/xmldb/db/ getestet. | ||
Finde alle Personen in der Datenbank: | Finde alle Personen in der Datenbank: | ||
<source lang="flwor"> | |||
(: Alle Personen :) | |||
//person | |||
</source> | |||
Finde die Person Wolfgang in der Datenbank: | Finde die Person Wolfgang in der Datenbank: | ||
<source lang="flwor"> | |||
(: Wolfgang :) | |||
//person[pid="1"] | |||
(: Wolfgang :) | |||
//person[lastname="Kowarschick" and firstname="Wolfgang"] | |||
</source> | |||
Finde die Wolfgangs Mutter in der Datenbank: | Finde die Wolfgangs Mutter in der Datenbank: | ||
<source lang="flwor"> | |||
(: pid von Wolfgangs Mutter :) | |||
//person[lastname="Kowarschick" and firstname="Wolfgang"]/mother/text() | |||
(: Wolfgangs Mutter:) | |||
//person[pid=//person[lastname="Kowarschick" and firstname="Wolfgang"]/mother/text()] | |||
</source> | |||
Eine einfache | Eine einfache Let-Anweisung: | ||
<source lang="flwor"> | |||
(: let-Anweisung (Konstanten-Deklaration) :) | |||
let $data := <person><pid>wk</pid></person> | |||
return $data | |||
</source> | |||
Eine String-Transformation: | Eine String-Transformation: | ||
<source lang="flwor"> | |||
(: transformiere String in XML :) | |||
declare namespace util="http://exist-db.org/xquery/util"; | |||
let $data as xs:string := "<person><pid>wk</pid></person>" | |||
return util:eval($data) | |||
</source> | |||
Eine | Eine einfache For-Anweisung: | ||
<source lang="flwor"> | |||
(: for-Anweisung :) | |||
for $person in collection('/db/ahnen')//person | |||
return string($person/lastname) | |||
</source> | |||
Erzeugung eines XML-Dokuments: | Erzeugung eines XML-Dokuments: | ||
<source lang="flwor"> | |||
(: Erzeuge ein neues XML-Dokument. :) | |||
let $person := //person[pid="1"] | |||
let $lastname as xs:string := $person/lastname/text() | |||
let $firstname as xs:string := $person/firstname/text() | |||
let $year as xs:string := $person/birthday/year/text() | |||
let $month as xs:string := $person/birthday/month/text() | |||
let $day as xs:string := $person/birthday/day/text() | |||
return | |||
<Person id="{$person/pid/text()}"> | |||
<Name> {$firstname} {" "} {$lastname} </Name> | |||
<Geburtstag>{$day}. {$month}. {$year}</Geburtstag> | |||
</Person> | |||
</source> | |||
Erzeugung eines komplexeren XML-Dokuments: | |||
<source lang="flwor"> | |||
(: Erzeuge ein neues XML-Dokument mit for-Schleife. | |||
$person/lastname/text() liefert Fehler bei leeren Tags | |||
=> string($person/lastname) funktioniert immer | |||
:) | |||
<Personen> | |||
{ | |||
for $person in collection('/db/ahnen')//person (: [lastname="Kowarschick"] :) | |||
let $lastname as xs:string := string($person/lastname) | |||
let $firstname as xs:string := string($person/firstname) | |||
let $year as xs:string := string($person/birthday/year) | |||
let $month as xs:string := string($person/birthday/month) | |||
let $day as xs:string := string($person/birthday/day) | |||
return | return | ||
<Person id="{$person/pid/text()}"> | <Person id="{$person/pid/text()}"> | ||
Zeile 50: | Zeile 83: | ||
<Geburtstag>{$day}. {$month}. {$year}</Geburtstag> | <Geburtstag>{$day}. {$month}. {$year}</Geburtstag> | ||
</Person> | </Person> | ||
} | |||
</Personen> | |||
</source> | |||
Berechne die Vorfahren von Sibylle: | |||
<source lang="flwor"> | |||
(: Berechne die Vorfahren einer oder mehrerer Personen :) | |||
declare namespace gen="http://www.fh-augsburg.de/xmlns/genealogy"; | |||
declare function gen:ancestors($pid as xs:string) as node()* | |||
< | { | ||
<person> | |||
{ | { | ||
//person[pid=$pid]/* | |||
[not(local-name()='mother') and not(local-name()='father')] | |||
} | } | ||
<mother> | |||
{ | |||
let $mid as xs:string := //person[pid=$pid]/mother | |||
return | |||
if ($mid) then gen:ancestors(string($mid)) else () | |||
} | |||
</mother> | |||
<father> | |||
< | |||
{ | { | ||
let $fid as xs:string := //person[pid=$pid]/father | |||
return | |||
if ($fid) then gen:ancestors(string($fid)) else () | |||
} | } | ||
</father> | |||
</person> | |||
}; | |||
<ancestors> | |||
{ | |||
for $person in //person[lastname='Kowarschick'][firstname='Sibylle'] | |||
return gen:ancestors(string($person/pid)) | |||
} | |||
</ancestors> | |||
</source> | |||
Berechne die Vorfahren von bestimmten Personen: | Berechne die Vorfahren von bestimmten Personen: | ||
<source lang="flwor"> | |||
(: Berechne die Vorfahren einer oder mehrerer Personen :) | |||
declare namespace gen="http://www.fh-augsburg.de/xmlns/genealogy"; | |||
declare namespace util="http://exist-db.org/xquery/util"; | |||
declare function gen:ancestors($pid as xs:string) as node()* | |||
{ | |||
<person> | |||
{ | { | ||
< | //person[pid=$pid]/* | ||
[not(local-name()='mother') and not(local-name()='father')] | |||
} | |||
<mother> | |||
{ | { | ||
let $mid as xs:string := //person[pid=$pid]/mother | |||
return | |||
if ($mid) then gen:ancestors(string($mid)) else () | |||
} | } | ||
</mother> | |||
<father> | |||
{ | |||
let $fid as xs:string := //person[pid=$pid]/father | |||
return | |||
if ($fid) then gen:ancestors(string($fid)) else () | |||
} | } | ||
</ancestors> | </father> | ||
</person> | |||
}; | |||
let $firstname as xs:string := "" (: gesuchter Vorname :) | |||
let $lastname as xs:string := "" (: gesuchter Nachname :) | |||
let $year as xs:string := "1987" (: gesuchtes Geburtsjahr :) | |||
(: | |||
let $firstname as xs:string := "Wolfgang" | |||
let $lastname as xs:string := "Kowarschick" | |||
let $year as xs:string := "" | |||
:) | |||
(: | |||
let $firstname as xs:string := "" | |||
let $lastname as xs:string := "" | |||
let $year as xs:string := "1961" | |||
:) | |||
(: | |||
let $firstname as xs:string := "" | |||
let $lastname as xs:string := "Kowarschick" | |||
let $year as xs:string := "" | |||
:) | |||
let $lastname_condition as xs:string := | |||
if ($lastname != "" and $lastname != "-") | |||
then concat("[lastname='", $lastname, "']") else "" | |||
let $firstname_condition as xs:string := | |||
if ($firstname != "" and $firstname != "-") | |||
then concat("[firstname='", $firstname, "']") else "" | |||
let $year as xs:string := | |||
if ($year != "" and $year != "-") | |||
then concat("[birthday/year='", $year, "']") else "" | |||
let $query as xs:string := | |||
concat("//person", $lastname_condition, $firstname_condition, $year, "") | |||
return | |||
<ancestors> | |||
<!-- <query>{$query}</query> --> | |||
{ | |||
for $person in util:eval($query) | |||
return gen:ancestors(string($person/pid)) | |||
} | |||
</ancestors> | |||
</source> | |||
=Quelle= | ==Quelle== | ||
* Die Beispiele wurden von [[Benutzer:Kowa|Wolfgang Kowarschick]] entwickelt. | * Die Beispiele wurden von [[Benutzer:Kowa|Wolfgang Kowarschick]] entwickelt. | ||
=Siehe auch= | ==Siehe auch== | ||
*http://www.datadirect.com/developer/xml/xquery/docs/katz_c01.pdf | *http://www.datadirect.com/developer/xml/xquery/docs/katz_c01.pdf |
Aktuelle Version vom 24. Mai 2016, 15:46 Uhr
Beispiele
Die folgenden XQuery-Beispiele wurden mit http://ahnen.multimedia.fh-augsburg.de:8080/exist/xmldb/db/ getestet.
Finde alle Personen in der Datenbank:
(: Alle Personen :)
//person
Finde die Person Wolfgang in der Datenbank:
(: Wolfgang :)
//person[pid="1"]
(: Wolfgang :)
//person[lastname="Kowarschick" and firstname="Wolfgang"]
Finde die Wolfgangs Mutter in der Datenbank:
(: pid von Wolfgangs Mutter :)
//person[lastname="Kowarschick" and firstname="Wolfgang"]/mother/text()
(: Wolfgangs Mutter:)
//person[pid=//person[lastname="Kowarschick" and firstname="Wolfgang"]/mother/text()]
Eine einfache Let-Anweisung:
(: let-Anweisung (Konstanten-Deklaration) :)
let $data := <person><pid>wk</pid></person>
return $data
Eine String-Transformation:
(: transformiere String in XML :)
declare namespace util="http://exist-db.org/xquery/util";
let $data as xs:string := "<person><pid>wk</pid></person>"
return util:eval($data)
Eine einfache For-Anweisung:
(: for-Anweisung :)
for $person in collection('/db/ahnen')//person
return string($person/lastname)
Erzeugung eines XML-Dokuments:
(: Erzeuge ein neues XML-Dokument. :)
let $person := //person[pid="1"]
let $lastname as xs:string := $person/lastname/text()
let $firstname as xs:string := $person/firstname/text()
let $year as xs:string := $person/birthday/year/text()
let $month as xs:string := $person/birthday/month/text()
let $day as xs:string := $person/birthday/day/text()
return
<Person id="{$person/pid/text()}">
<Name> {$firstname} {" "} {$lastname} </Name>
<Geburtstag>{$day}. {$month}. {$year}</Geburtstag>
</Person>
Erzeugung eines komplexeren XML-Dokuments:
(: Erzeuge ein neues XML-Dokument mit for-Schleife.
$person/lastname/text() liefert Fehler bei leeren Tags
=> string($person/lastname) funktioniert immer
:)
<Personen>
{
for $person in collection('/db/ahnen')//person (: [lastname="Kowarschick"] :)
let $lastname as xs:string := string($person/lastname)
let $firstname as xs:string := string($person/firstname)
let $year as xs:string := string($person/birthday/year)
let $month as xs:string := string($person/birthday/month)
let $day as xs:string := string($person/birthday/day)
return
<Person id="{$person/pid/text()}">
<Name> {$firstname} {" "} {$lastname} </Name>
<Geburtstag>{$day}. {$month}. {$year}</Geburtstag>
</Person>
}
</Personen>
Berechne die Vorfahren von Sibylle:
(: Berechne die Vorfahren einer oder mehrerer Personen :)
declare namespace gen="http://www.fh-augsburg.de/xmlns/genealogy";
declare function gen:ancestors($pid as xs:string) as node()*
{
<person>
{
//person[pid=$pid]/*
[not(local-name()='mother') and not(local-name()='father')]
}
<mother>
{
let $mid as xs:string := //person[pid=$pid]/mother
return
if ($mid) then gen:ancestors(string($mid)) else ()
}
</mother>
<father>
{
let $fid as xs:string := //person[pid=$pid]/father
return
if ($fid) then gen:ancestors(string($fid)) else ()
}
</father>
</person>
};
<ancestors>
{
for $person in //person[lastname='Kowarschick'][firstname='Sibylle']
return gen:ancestors(string($person/pid))
}
</ancestors>
Berechne die Vorfahren von bestimmten Personen:
(: Berechne die Vorfahren einer oder mehrerer Personen :)
declare namespace gen="http://www.fh-augsburg.de/xmlns/genealogy";
declare namespace util="http://exist-db.org/xquery/util";
declare function gen:ancestors($pid as xs:string) as node()*
{
<person>
{
//person[pid=$pid]/*
[not(local-name()='mother') and not(local-name()='father')]
}
<mother>
{
let $mid as xs:string := //person[pid=$pid]/mother
return
if ($mid) then gen:ancestors(string($mid)) else ()
}
</mother>
<father>
{
let $fid as xs:string := //person[pid=$pid]/father
return
if ($fid) then gen:ancestors(string($fid)) else ()
}
</father>
</person>
};
let $firstname as xs:string := "" (: gesuchter Vorname :)
let $lastname as xs:string := "" (: gesuchter Nachname :)
let $year as xs:string := "1987" (: gesuchtes Geburtsjahr :)
(:
let $firstname as xs:string := "Wolfgang"
let $lastname as xs:string := "Kowarschick"
let $year as xs:string := ""
:)
(:
let $firstname as xs:string := ""
let $lastname as xs:string := ""
let $year as xs:string := "1961"
:)
(:
let $firstname as xs:string := ""
let $lastname as xs:string := "Kowarschick"
let $year as xs:string := ""
:)
let $lastname_condition as xs:string :=
if ($lastname != "" and $lastname != "-")
then concat("[lastname='", $lastname, "']") else ""
let $firstname_condition as xs:string :=
if ($firstname != "" and $firstname != "-")
then concat("[firstname='", $firstname, "']") else ""
let $year as xs:string :=
if ($year != "" and $year != "-")
then concat("[birthday/year='", $year, "']") else ""
let $query as xs:string :=
concat("//person", $lastname_condition, $firstname_condition, $year, "")
return
<ancestors>
<!-- <query>{$query}</query> -->
{
for $person in util:eval($query)
return gen:ancestors(string($person/pid))
}
</ancestors>
Quelle
- Die Beispiele wurden von Wolfgang Kowarschick entwickelt.
Siehe auch
- http://www.datadirect.com/developer/xml/xquery/docs/katz_c01.pdf
- http://www.w3schools.com/xquery/default.asp
- http://www.research.ibm.com/journal/sj/414/chamberlin.pdf
Dieser Artikel ist GlossarWiki-konform.