2016-10-27 4 views
0

xqueryを使用して、ソースxmlファイルの値を検索し、svgファイルと比較しています。ここ は私のXQueryです:xquery関数 "functx:between-inclusive"を使用すると、最初の引数が2つの異なる属性値から来る可能性はありますか?

for $xval in $figure/graphic/sheet/doc(@svgsrc)//*[text() = $rdi/text()], 
    $line in $figure/graphic/sheet/doc(@svgsrc)/svg/line 
where functx:between-inclusive($xval/@x, $line/@x2, $line/@x1) 
return $line/@class 

すべての$ XVAL(SVGのテキスト要素)が@x属性を持っている時には、上記XQueryはうまく動作します。しかし、一部の$ xvalは、@ transform = "行列(0 -1 1 0 248.402 118.972)"を持ちます。ここで、xの値は行列の5番目の位置です。

functx:between-inclusiveの最初の引数は2つの異なる属性値から来る可能性はありますか?

良い方法がありますか?

答えて

1

あなたの質問から、あなたは@xが利用できないときは、常に@transform値を選択するように聞こえる:

for $xval in $figure/graphic/sheet/doc(@svgsrc)//*[text() = $rdi/text()], 
    $line in $figure/graphic/sheet/doc(@svgsrc)/svg/line 
let $x := ($xval/@x, xs:double(tokenize($xval/@transform, '\s')[5]))[1] 
where functx:between-inclusive($x, $line/@x2, $line/@x1) 
return $line/@class 

これは最初のものだけを選択し、変数$xに両方の値のシーケンスを割り当てます。最初の値が空の場合、2番目の値は1項目シーケンスの最初の値になるため選択されます。

+0

迅速な対応をありがとう!あなたの合計はまさに私がやろうとしているものです。ただし、let節を追加しても何も返されません。別の方法がありますか?私はSaxon-EE xqueryを使用しています。9.5.1.7 – user3618078

+0

この回答はあなたが質問で尋ねたことを行います。それでも問題が解決しない場合は、コードに別のエラーがある可能性がありますが、テストデータを提供していないため知ることは不可能です。また、あなたのクエリには含まれていない '$ rdi'という変数を参照していますので、これは大きなクエリのほんの一部であると考えて、さらに問題を複雑にしています。私は新しい問題の小テストケースを作成し、それをサンプルデータと別の質問として投稿することをお勧めします。それがあなたを助けたなら、この答えを受け入れてください。 – wst

+0

svgファイルにエラーが見つかりました。私はこれらの名前空間を削除した後、svgファイルからxmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink"コードが動作します! – user3618078

関連する問題