2016-03-22 4 views
0

私は(私はサクソンを使用しています)FLWORクエリのこの種を実行したいと思います:Saxon XQueryとコレクション:FLWORクエリで、返されたアイテムのファイル名を取得することは可能ですか?

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) 

プロセッサによって発見返されるアイテム大規模なコレクション、上で作業しているとき、私はすぐに、見つけることができる。この方法は、 findコマンドのような外部プログラムを使う必要はありません。

私はdocument-uri()とbase-uri()関数を使用しようとしましたが、成功しませんでした。

これを達成する方法はありますか?

答えて

1

document-uri()関数は、必要なものを与えるはずです。私はちょうど

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

を試してみましたが、それは私の作品のコレクション内のアイテムを提供されるすべての文書ノードです(ただし、コレクションが文書ノード以外の項目として取得された非XMLリソースが含まれている場合、それはタイプエラーで失敗します)

もう1つの方法は、リソース自体ではなくリソースのURIを提供するuri-collection()を使用することです。 doc()関数(またはリソースのタイプに応じてjson-doc()またはunparsed-text())を使用して、特定のリソースを取得できます。

+0

ご返信ありがとうございます。 'コレクション内の$ uriのための( 'ファイル:?。/ xmlDir = * [XML]を選択します;再帰= YES') 私はこれを試してみました!(。)文書-URI \tリターン($ URI)' 確かに私はファイル名のリストを取得します。 しかし、今では、flworクエリのforループ内のノードにどのようにフィードできますか? は私がしようとした場合: 'コレクション内の$ uriの( 'ファイル:/ xmlDir = * [XML]を選択します;再帰= yesの?。')のための文書-URI \tのlet $アイテム!(。):= $ URI /アイテム "/ 'の最初のオペランドの必須アイテムタイプはnode()です;指定された値にアイテムタイプがありますxs:anyURI" おそらく解決策は簡単でしょうか? $ itemsノードをループする方法は? – mattt

+0

あなたは何をしたいのか分からずに書くべきコードを教えてもらえません。私はcollection()から戻ってきたノードにdocument-uri()を適用できることを実証していました。つまり、 'for $ d for collection(..)return {$d}' –

+0

ありがとうございます。私の最初の例のように、私は項目とそれを含むファイル名の両方をflworから戻したいと思います。 このようにネストされたflworを使用してこれを行うことができました:コレクション内の$ uriのための 'for:ファイル:/ xmlDir?select = *。xml; recurse = yes ')!document-uri(。) \t for $ ($ itemToRetrieve、$ uri) ' \t しかし、私は多くのクエリを変更する必要があります。コレクション。 元のクエリに影響を与えずにファイル名を返す方法はありますか? – mattt

関連する問題