2

次のクエリが与えられた

let $a := xs:dateTime("2012-01-01T00:00:00.000+00:00")
let $b := xs:dateTime($a)
let $c := xs:dateTime($a cast as xs:string)
(: cannot - don't know how to - execute the function without assignment :)
let $d := adjust-dateTime-to-timezone($a, xs:dayTimeDuration("PT1H"))
return (<a>{$a}</a>,<b>{$b}</b>,<c>{$c}</c>)

出力は次のとおりです

<a>2012-01-01T01:00:00+01:00</a>
<b>2012-01-01T01:00:00+01:00</b>
<c>2012-01-01T00:00:00Z</c>

コンストラクター関数に関するXQueryのドキュメント(特定のタイプのコンストラクター関数は、他のアトミックタイプのインスタンスを特定のタイプに変換するために使用されます)に基づくと、これは予想される動作です。xs:dateTime($ a)を呼び出すと、キャストする必要がないため$ aが返されますが、 xs:dateTime($ aがxs:stringとしてキャスト)は、最初に$ aから 新しいxs:stringを作成します。ただし、これには追加の変換が必要です。

この問題に取り組む他の方法はありますか?または、変換は安価で、気にしないでください。

(違いがある場合、私のXQueryプロセッサはBaseX 7.2です。)


BaseXを使用していることが違いを生むようですこれがxs:dateTimeコンストラクター関数とadjust-dateTime-to-timezone関数が機能する方法であると本当に思っていたので、XQueryのドキュメントを誤って解釈しました。

私がDimitreRanonから与えられた入力を考えると、説明されている問題はなくなったようです。

私のユースケースが、またはそれと同じように XMLデータセットの日時要素に対して日時間隔ベースのクエリを作成したかった理由です。入力パラメーターとソース日時の値が異なるタイムゾーンを使用しているため、上記の関数を使用してタイムゾーンを修正する必要がありました。これにより、入力パラメーター(私の場合は元のソース日時)が変更されましたが、元の値を保持します。関数の名前adjust-dateTimeを考えると、引数を変更しても問題ないと思ったので、元の日時値を保持できるようにするには、コンストラクター関数を使用して元の値をコピーする必要があると自動的に考えました。

4

2 に答える 2

1

本当に奇妙なバグに遭遇したようです。

XQuery は不変変数 (変数を変更しないでください) を持ち、副作用のない$a-c関数型プログラミング言語であるため、5 行目はまったく変更しないでください。adjust-dateTime-to-timezoneそうし$dないと、計算結果が直接破棄されてしまいます。

バグリクエストを送信しました。Zorba はクエリを正しく実行しており、問題を理解するために使用できます。

お好みの XQuery プロセッサである BaseX も、数日以内に実行されます。私または他の BaseX チーム メンバーは、問題が修正され次第、ここであなたをトリガーします。

あなたの問題は、BaseX の誤解と間違った動作から生じたものであり、解決する必要があると思います。ご不明な点がございましたら、お気軽にもう一度お問い合わせください。

于 2012-04-08T21:14:26.993 に答える
0

報告された出力は正しくありません

正しい出力 (oXygen で Saxon を実行して生成) は次のとおりです。

<a>2012-01-01T00:00:00Z</a>
<b>2012-01-01T00:00:00Z</b>
<c>2012-01-01T00:00:00Z</c>

adjust-dateTime-to-timezone()関数は、他の関数がその引数を変更できないため、その効果は変数にのみ含まれます。これは句$dでは使用しません。return

于 2012-04-08T23:27:38.713 に答える