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 cast as xs:string)首先从$a 创建一个新的xs:string。但是,这需要额外的转换。

有没有其他方法可以解决这个问题?或者转换很便宜,我不应该关心?

(如果有什么不同,我的 XQuery 处理器是BaseX 7.2。)


看来我使用 BaseX确实有所不同。我真的认为这是xs:dateTime构造函数和adjust-dateTime-to-timezone函数应该工作的方式,这就是我误解 XQuery 文档的原因。

鉴于 Dimitre 和 Ranon 给我的意见看来所描述的问题已经消失了。

由于我的用例是,或者更像,我想对我的 XML 数据集的日期时间元素进行基于日期时间间隔的查询。因为输入参数和源日期时间值使用不同的时区,所以我必须使用上述函数进行时区更正,这修改了它的输入参数(在我的例子中是原始源日期时间),但是我想保留原始值。给定函数的名称adjust-dateTime我认为它可以修改它的参数,所以我自动认为我必须使用构造函数复制我的原始值才能保留原始日期时间值。

4

2 回答 2

1

看起来你遇到了一些非常奇怪的错误。

您的第 5 行根本不应该改变$a-c,因为 XQuery 是一种函数式编程语言,具有不可变变量(adjust-dateTime-to-timezone不应该改变您的变量)并且没有副作用。这就是您被迫分配的原因$d,否则您的计算结果将直接被丢弃。

我刚刚提交了一些错误请求。Zorba 的查询是正确的,您可以使用它来理解问题。

BaseX 作为您首选的 XQuery 处理器也将在几天内完成。我或其他 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 回答