2016-03-22 10 views
0

Ich möchte diese Art von FLWOR Abfrage auszuführen (I Saxon bin mit):Saxon XQuery und Collection: Ist es in der FLWOR-Abfrage möglich, Dateinamen von zurückgegebenen Elementen abzurufen?

for $baseItem in collection('file:/xmlDir?select=*.xml;recurse=yes')/item 
    let $itemToRetrieve := xs:string($baseItem/item) 
    let $itemFilter := xs:string($baseItem/filter) 
    let $fileName := tokenize("*xmlPath($baseItem)*"),'/')[last()] 
    where $itemFilter = 'test' 
    return ($itemToRetrieve, $fileName) 

So kann ich schnell finden konnte, wenn sie auf einer großen Sammlung arbeiten, wo die zurückgegebenen Posten, bei denen durch den Prozessor gefunden, ohne ein externes Programm verwenden zu müssen, wie zB Befehle finden.

Ich habe versucht, Dokument-URI() und Base-URI() Funktionen zu verwenden, aber ohne Erfolg.

Gibt es einen Weg, dies zu erreichen?

Antwort

1

Die document-uri() Funktion sollte Ihnen geben, was Sie wollen. Ich habe gerade versucht

collection($someURI)!document-uri(.) 

und es funktioniert für mich die Elemente in der Auflistung sofern alle Dokumentknoten sind (aber es funktioniert nicht mit einer Art Fehler, wenn die Sammlung nicht-XML-Ressourcen enthält, die andere als Dokument Knoten als Elemente abgerufen werden)

Ein anderer Ansatz ist die Verwendung von uri-collection(), die Ihnen die URIs der Ressourcen und nicht die Ressourcen selbst liefert; Sie können dann die gewünschten Ressourcen mithilfe der Funktion doc() (oder json-doc() oder nicht geparsten Text() abhängig vom Ressourcentyp abrufen).

+0

Vielen Dank für Ihre Antwort. Ich habe versucht, dieses: 'für $ uri in der Sammlung ('file:./XmlDir wählen = * xml; recurse = yes')! (.) Dokument-uri \t return ($ uri)' Tat I Erhalte die Liste der Dateinamen. Aber jetzt, wie kann ich die Knoten in der For-Schleife der Flwor-Abfrage füttern? Wenn ich versuche: 'für in Sammlung $ uri ('file:/xmlDir wählen = * xml; recurse = yes?.') Dokument-uri \t let $ item! (.): = $ Uri/item \t return ($ item, $ uri) ' \t Ich bekomme den Fehler:" Erforderlicher Elementtyp des ersten Operanden von '/' ist node(); gelieferter Wert hat Elementtyp xs: anyURI " Vielleicht ist die Lösung trivial? Wie kann ich es schaffen, $ Items Nodes zu durchlaufen? – mattt

+0

Es ist schwer zu sagen, welchen Code man schreiben soll, ohne zu wissen, was man machen möchte; Ich habe gerade demonstriert, dass Sie Document-URI() auf die Knoten anwenden können, die von collection() zurückkommen, was bedeutet, dass Sie auch zum Beispiel 'für $ d in Sammlung (..) {$d}' –

+0

Dank. Wie in meinem ersten Beispiel möchte ich sowohl ein Element als auch den Dateinamen, der es enthält, von flwor zurückgeben. Ich konnte das mit nested flwor wie folgt tun: 'für $ uri in Sammlung ('Datei:/xmlDir? Auswählen = *. Xml; recurse = ja')! Document-URI (.) \t für $ itemToRetrieve in doc (\ $ uri)/item \t return ($ itemToRetrieve, $ uri) ' \t Aber ich fürchte, ich werde viele Anfragen ändern, vor allem, wenn ich summieren müssen Werte über alle Dateien in die Sammlung. Gibt es eine Möglichkeit, den Dateinamen ohne Auswirkungen auf die ursprüngliche Abfrage zurückzugeben? – mattt

Verwandte Themen