Announcement

Collapse
No announcement yet.

Problem mit Funktion: 1. oder letztes Element in Datei

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit Funktion: 1. oder letztes Element in Datei

    Hallo,

    ich habe eine Aufgabe bekommen. Ich weiß aber nicht so recht wie ich diese angehen soll. Es geht darum eine XQuery-Funktion zu schreiben, die feststellt, ob es sich um die erste oder letzte Karte in einem XML Dokument handelt. Eingabe soll das das Kartenelement und der Name des XML-Dokuments sein.

    Ich habe mal ein wenig rumgebastelt und erst mal versucht überhaupt die erste Karte heraus zu bekommen, das funktioniert aber auch nicht so recht.

    declare function local:EintragBestimmen($karte as element()) as xs:string{
    for $e in doc("Kasten.xml")//Karte
    return
    {if ($karte =$e[1]) then "erste Karte" else
    if ($karte=$e[position()=last()]) then "letzte Karte"
    else "weder erste noch letzte Karte"}
    };

    local:EintragBestimmen(doc("Kasten.xml")//Karte[1])


    Kasten.xml:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <Kartenkasten>
    <Karte>
    <Stichwort>XQuery</Stichwort>
    <Sachgebiet>Datenbank</Sachgebiet>
    <Abstract>Gutes Referenzwerk in Deutsch</Abstract>
    <Inhalt Typ="S">
    <Titel>XQuery</Titel>
    <Autor>Lehnert</Autor>
    <Link>http://www.oreilly.de/</Link>
    </Inhalt>
    </Karte>
    <Karte>
    <Stichwort>SQL</Stichwort>
    <Sachgebiet>Datenbank</Sachgebiet>
    <Abstract>Ein Buch über Datenbanken</Abstract>
    <Inhalt Typ="S">
    <Titel>SQL Kurz und gut</Titel>
    <Autor>Jonathan Gennick</Autor>
    <Link>http://www.oreilly.de/</Link>
    </Inhalt>
    </Karte>
    <Karte>
    <Stichwort>Java</Stichwort>
    <Sachgebiet>Programmierung</Sachgebiet>
    <Abstract>Programmierung mit Java für Anfänger</Abstract>
    <Inhalt Typ="I">
    <Titel>Java ist auch eine Insel</Titel>
    <Autor>Christian Ullenboom</Autor>
    <Link>http://openbook.galileocomputing.de/javainsel8/</Link>
    </Inhalt>
    </Karte>
    </Kartenkasten>

  • #2
    Code:
    declare function local:KarteBestimmen($karte as element(Karte)) as xs:string
    {
      if ($karte is root($karte)/descendant::Karte[1])
      then "erstes"
      else if ($karte is root($karte)/descendant::Karte[last()])
      then "letztes"
      else "anderes"
    };
    
    let $doc := <Kartenkasten>
    <Karte>
    <Stichwort>XQuery</Stichwort>
    <Sachgebiet>Datenbank</Sachgebiet>
    <Abstract>Gutes Referenzwerk in Deutsch</Abstract>
    <Inhalt Typ="S">
    <Titel>XQuery</Titel>
    <Autor>Lehnert</Autor>
    <Link>http://www.oreilly.de/</Link>
    </Inhalt>
    </Karte>
    <Karte>
    <Stichwort>SQL</Stichwort>
    <Sachgebiet>Datenbank</Sachgebiet>
    <Abstract>Ein Buch über Datenbanken</Abstract>
    <Inhalt Typ="S">
    <Titel>SQL Kurz und gut</Titel>
    <Autor>Jonathan Gennick</Autor>
    <Link>http://www.oreilly.de/</Link>
    </Inhalt>
    </Karte>
    <Karte>
    <Stichwort>Java</Stichwort>
    <Sachgebiet>Programmierung</Sachgebiet>
    <Abstract>Programmierung mit Java für Anfänger</Abstract>
    <Inhalt Typ="I">
    <Titel>Java ist auch eine Insel</Titel>
    <Autor>Christian Ullenboom</Autor>
    <Link>http://openbook.galileocomputing.de/javainsel8/</Link>
    </Inhalt>
    </Karte>
    </Kartenkasten> 
    
    return (local:KarteBestimmen($doc/descendant::Karte[1]), local:KarteBestimmen($doc/descendant::Karte[2]),  local:KarteBestimmen($doc/descendant::Karte[last()]))

    Comment


    • #3
      Funktioniert schon mal super. Wie kann ich die Funktion noch so umstricken, dass ich neben dem Element auch noch den Dateinamen als Eingabe habe? Hast du da vielleicht noch einen Tipp für mich?

      Comment


      • #4
        Code:
        declare function local:KarteBestimmen($karte as element(Karte), $datei as xs:string) as xs:string
        {
          if ($karte is doc($datei)/descendant::Karte[1])
          then "erstes"
          else if ($karte is doc($datei)/descendant::Karte[last()])
          then "letztes"
          else "anderes"
        };

        Comment


        • #5
          Hallo,

          funktioniert, ich hab das Ganze noch ein wenig umgestellt, jetzt tut es das was es soll. Vielen Dank!

          Comment


          • #6
            Vollständige Lösung gesucht

            Originally posted by xquery_newbie View Post
            Hallo,

            funktioniert, ich hab das Ganze noch ein wenig umgestellt, jetzt tut es das was es soll. Vielen Dank!

            Kannst du mir deine Lösung zukommen lassen ? Sieht so aus als ob du auch den XML kurs bei SGD machst/gemachst hat. Ich hänge auch an diesem Problem

            gruss

            senge

            Comment


            • #7
              Probleme mit dieser Lösung

              Originally posted by Martin Honnen View Post
              Code:
              declare function local:KarteBestimmen($karte as element(Karte)) as xs:string
              {
                if ($karte is root($karte)/descendant::Karte[1])
                then "erstes"
                else if ($karte is root($karte)/descendant::Karte[last()])
                then "letztes"
                else "anderes"
              };
              
              let $doc := <Kartenkasten>
              <Karte>
              <Stichwort>XQuery</Stichwort>
              <Sachgebiet>Datenbank</Sachgebiet>
              <Abstract>Gutes Referenzwerk in Deutsch</Abstract>
              <Inhalt Typ="S">
              <Titel>XQuery</Titel>
              <Autor>Lehnert</Autor>
              <Link>http://www.oreilly.de/</Link>
              </Inhalt>
              </Karte>
              <Karte>
              <Stichwort>SQL</Stichwort>
              <Sachgebiet>Datenbank</Sachgebiet>
              <Abstract>Ein Buch über Datenbanken</Abstract>
              <Inhalt Typ="S">
              <Titel>SQL Kurz und gut</Titel>
              <Autor>Jonathan Gennick</Autor>
              <Link>http://www.oreilly.de/</Link>
              </Inhalt>
              </Karte>
              <Karte>
              <Stichwort>Java</Stichwort>
              <Sachgebiet>Programmierung</Sachgebiet>
              <Abstract>Programmierung mit Java für Anfänger</Abstract>
              <Inhalt Typ="I">
              <Titel>Java ist auch eine Insel</Titel>
              <Autor>Christian Ullenboom</Autor>
              <Link>http://openbook.galileocomputing.de/javainsel8/</Link>
              </Inhalt>
              </Karte>
              </Kartenkasten> 
              
              return (local:KarteBestimmen($doc/descendant::Karte[1]), local:KarteBestimmen($doc/descendant::Karte[2]),  local:KarteBestimmen($doc/descendant::Karte[last()]))
              Hallo,

              wenn ich diese Lösung mit meinem IPSI Xquery interpreter ausführe, bekomme ich einen Java error. Habt ihr eine Idee an was das liegen kann ??

              Comment

              Working...
              X