XML Query Language/Beispiele: Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Keine Bearbeitungszusammenfassung
 
(8 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
==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:
  (: Alle Personen :)
<source lang="flwor">
  //person
(: Alle Personen :)
//person
</source>


Finde die Person Wolfgang in der Datenbank:
Finde die Person Wolfgang in der Datenbank:
  (: Wolfgang :)
<source lang="flwor">
  //person[pid="1"]
(: Wolfgang :)
//person[pid="1"]


  (: Wolfgang :)
(: Wolfgang :)
  //person[lastname="Kowarschick" and firstname="Wolfgang"]
//person[lastname="Kowarschick" and firstname="Wolfgang"]
</source>


Finde die Wolfgangs Mutter in der Datenbank:
Finde die Wolfgangs Mutter in der Datenbank:
  (: pid von Wolfgangs Mutter :)
<source lang="flwor">
  //person[lastname="Kowarschick" and firstname="Wolfgang"]/mother/text()
(: pid von Wolfgangs Mutter :)
//person[lastname="Kowarschick" and firstname="Wolfgang"]/mother/text()


  (: Wolfgangs Mutter:)
(: Wolfgangs Mutter:)
  //person
//person[pid=//person[lastname="Kowarschick" and firstname="Wolfgang"]/mother/text()]
    [pid=//person[lastname="Kowarschick" and firstname="Wolfgang"]/mother/text()]
</source>


Eine einfache let-Anweisung:
Eine einfache Let-Anweisung:
  (: let-Anweisung (Konstanten-Deklaration) :)
<source lang="flwor">
  let $data := <person><pid>wk</pid></person>
(: let-Anweisung (Konstanten-Deklaration) :)
  return $data
let $data := <person><pid>wk</pid></person>
return $data
</source>


Eine String-Transformation:
Eine String-Transformation:
  (: transformiere String in XML :)
<source lang="flwor">
  declare namespace util="http://exist-db.org/xquery/util";
(: transformiere String in XML :)
  let $data as xs:string := "<person><pid>wk</pid></person>"
declare namespace util="http://exist-db.org/xquery/util";
  return util:eval($data)
let $data as xs:string := "<person><pid>wk</pid></person>"
return util:eval($data)
</source>


Eine einfach for-Anweisung:
Eine einfache For-Anweisung:
  (: for-Anweisung :)
<source lang="flwor">
  for $person in collection('/db/ahnen')//person
(: for-Anweisung :)
  return string($person/lastname)
for $person in collection('/db/ahnen')//person
return string($person/lastname)
</source>


Erzeugung eines XML-Dokuments:
Erzeugung eines XML-Dokuments:
  (: Erzeuge ein neues XML-Dokument. :)
<source lang="flwor">
  let $person := //person[pid="1"]
(: Erzeuge ein neues XML-Dokument. :)
  let $lastname  as xs:string := $person/lastname/text()
let $person := //person[pid="1"]
  let $firstname as xs:string := $person/firstname/text()
let $lastname  as xs:string := $person/lastname/text()
  let $year      as xs:string := $person/birthday/year/text()
let $firstname as xs:string := $person/firstname/text()
  let $month    as xs:string := $person/birthday/month/text()
let $year      as xs:string := $person/birthday/year/text()
  let $day      as xs:string := $person/birthday/day/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 49: Zeile 83:
       <Geburtstag>{$day}. {$month}. {$year}</Geburtstag>
       <Geburtstag>{$day}. {$month}. {$year}</Geburtstag>
     </Person>
     </Person>
}
</Personen>
</source>


Erzeugung eines komplexeren XML-Dokuments:
Berechne die Vorfahren von Sibylle:
  (: Erzeuge ein neues XML-Dokument mit for-Schleife.
<source lang="flwor">
    $person/lastname/text() liefert Fehler bei leeren Tags
(: Berechne die Vorfahren einer oder mehrerer Personen :)
  => string($person/lastname) funktioniert immer
declare namespace gen="http://www.fh-augsburg.de/xmlns/genealogy";
  :)
declare function gen:ancestors($pid as xs:string) as node()*
   <Personen>
{
   <person>
   {
   {
     for $person in collection('/db/ahnen')//person (: [lastname="Kowarschick"] :)
     //person[pid=$pid]/*
    let $lastname  as xs:string := string($person/lastname)
      [not(local-name()='mother') and not(local-name()='father')]
    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>
    <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 :)
(: Berechne die Vorfahren einer oder mehrerer Personen :)
  declare namespace gen="http://www.fh-augsburg.de/xmlns/genealogy";
declare namespace gen="http://www.fh-augsburg.de/xmlns/genealogy";
  declare namespace util="http://exist-db.org/xquery/util";
declare namespace util="http://exist-db.org/xquery/util";
  declare function gen:ancestors($pid as xs:string) as node()*
declare function gen:ancestors($pid as xs:string) as node()*
{
  <person>
   {
   {
     <person>
    //person[pid=$pid]/*
      [not(local-name()='mother') and not(local-name()='father')]
  }
     <mother>
     {
     {
       collection('/db/ahnen')//person[pid=$pid]/*
       let $mid as xs:string := //person[pid=$pid]/mother
        [not(local-name()='mother') and not(local-name()='father')]
      return
      if ($mid) then gen:ancestors(string($mid)) else ()
     }
     }
      <mother>
    </mother>
      {
    <father>
        let $mid as xs:string := //person[pid=$pid]/mother
    {
        return
      let $fid as xs:string := //person[pid=$pid]/father
        if ($mid) then gen:ancestors(string($mid)) else ()
      return
      }
      if ($fid) then gen:ancestors(string($fid)) 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>
    </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, 16: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

Siehe auch


Dieser Artikel ist GlossarWiki-konform.