2016-04-07 2 views
0

Ich brauche den Titel der Bücher und Zeitschriften zurückzukehren, wo „John Doe“, der Autor ist, aber meine XML-Datei eingerichtet ist, wie:Ist es möglich, OR für eine WHERE-Klausel in XQuery zu verwenden?

<library> 
<book>...</book> 
<article>...</article> 
</library> 

Es gibt 6 Bücher und Zeitschriften insgesamt.

Ich weiß, dass, wenn diese SQL war ich so etwas wie tun könnte:

SELECT title 
FROM library 
WHERE bookauthor = "John Doe" OR articleauthor = "John Doe" 

(diese Datenbank würde nicht normalisiert, aber ich versuche zu zeigen, dass ich glaube, ich weiß, was ich tun muss, , nur nicht sicher, wie mit XQuery)

ich folgenden versucht und es kehrte alle 6 Titel zu mir:

for $x in doc("xmldata.xml")/library 
let $a := $x/article 
let $b := $x/book 
return ($a/title, $b/title) 

Aber ich bin nicht sicher, was mit der Where-Klausel zu tun. Ebenso habe ich versucht, die folgenden, habe an der gleichen Stelle stecken:

for $x in doc("xmldata.xml")/library 
return ($x/article/title, $x/book/title) 

Wenn ich in ein hinzuzufügen versuchen, where-Klausel es noch alle 6 Einträge zurückgibt, obwohl es nur 1 Buch und 1 Artikel zurückgeben sollte:

for $x in doc("xmldata.xml")/library 
where $x/article/author = 'John Doe' 
where $x/book/author = 'John Doe' 
return ($x/article/title, $x/book/title) 

Kann mir bitte jemand helfen? Vielleicht indem sie mich in die richtige Richtung weisen oder darauf hinweisen, wo ich falsch liege.

Vollständige XML-Datei:

<library> 
<book> 
    <author>John Doe</author> 
    <title>Turnitin</title> 
</book> 
<article> 
    <author>John Doe</author> 
    <title>Evaluating</title> 
</article> 
<article> 
    <author>Shannon, L.</author> 
    <title>Reconceptualising</title> 
</article> 
<book> 
    <author>Burden, David</author> 
    <title>An evaluation</title> 
</book> 
<article> 
    <author>Moscrop, C.</author> 
    <title>Evaluating a systematic method</title> 
</article> 
<book> 
    <author>Beaumont, C.</author> 
    <title>Beyond e-learning</title> 
</book> 
</library> 
+0

Können Sie eine größere Stichprobe der Quelle XML schreiben? Ich sehe nichts falsch mit Ihrer letzten Abfrage. – wst

+0

Ich habe jetzt die Quell-XML am Ende des Posts hinzugefügt, danke! – user2633709

Antwort

0

Leider verpasste ich die Pfade, die Sie Abfragen wurden. Es gibt nur ein Bibliothekselement, so dass Ihre for Schleife nur einmal iteriert wurde und dann mindestens eine<author> Ihre where -Klausel entspricht, gab es alle Werte von <library> zurück.

Die Lösung ist eine Ebene tiefer in der Hierarchie iterieren:

for $x in doc("xmldata.xml")/library/* 
where $x/author = 'John Doe' 
return $x/title 

Oder wenn Sie in den Elementen sehr klar sein wollen Sie wählen:

for $x in doc("xmldata.xml")/library/(article|book) 
... 

Zur Ausgabe von Werten steuern für verschiedene Elemente können Sie verschiedene XPath in Ihrer Rückkehr verwenden:

... 
return ($x/self::book/title, $x/self::article/author) 
+0

Hi nicht sicher, ich verstehe deine Antwort? :) Sagst du, dass ich bei meiner Anfrage einen Fehler gemacht habe?Ich möchte den Titel zurückgeben, wenn Bibliothek/Artikel/Autor = "John Doe" ODER wenn Bibliothek/Buch/Autor = "John Doe" – user2633709

+0

Entschuldigung ich antwortete zu früh! es sagte nur "Entschuldigung, ich habe die Wege verpasst, die du abgefragt hast." Das funktioniert super, danke! Die Erklärung ist auch hilfreich – user2633709

+0

Hallo Entschuldigung, es gibt noch eine andere Sache, die ich tun möchte, nämlich den Autor für Artikel und den Titel für Bücher zurückzugeben. Wenn ich einen Autor in die Rückgabe hinzufüge, wird immer noch der Titel zurückgegeben. Gibt es einen Weg dahin? – user2633709

0

Sie können die w verwenden ildcard * den Elementen entsprechen, unabhängig von ihrem Namen:

doc("xmldata.xml")/library/*[author = 'John Doe']/title 

dies entspricht dem ausführlicheren FLWOR Ausdruck

for $entry in doc("xmldata.xml")/library/* 
where $entry/author = 'John Doe' 
return $entry/title 
+0

danke für das! : D – user2633709

+0

Hallo Entschuldigung es gibt noch eine andere Sache, die ich tun möchte, nämlich den Autor für Artikel und den Titel für Bücher zurückzugeben. Wenn ich einen Autor in die Rückgabe hinzufüge, wird immer noch der Titel zurückgegeben. Gibt es einen Weg dahin? – user2633709

+0

Es gibt viele Möglichkeiten, dies zu tun; Probieren Sie dies zum Beispiel aus: 'let $ lib: = doc (" xmldata.xml ")/library return ($ lib/artikel [author = 'John Doe']/autor, $ lib/book [author = 'John Doe']/Titel) '. Für weitere Fragen öffnen Sie besser einen neuen StackOverflow-Eintrag. –

Verwandte Themen