2011-04-22 28 views
2

我有以下XQuery代码,它从我的O'Reilly的书XQuery的阅读似乎像它应该工作:在可可的NSXML XQuery与日期时间减去持续时间

let $now := current-dateTime() 
let $month := xs:dayTimeDuration("P30D") 
let $month_ago := $now - $month 
return $month_ago 

它工作正常,在此居住的XQuery解释: http://try.zorba-xquery.com/ 但是在Cocoa的NSXML中,它返回XQuery错误“操作符的类型无效”。

有什么我不明白可可的XQuery实现吗?

回答

3

您应该使用xs:dayTimeDurationxs:yearMonthDuration定义为substracting operators

为了证明这一点,这XQuery的:

let $now := current-dateTime() 
let $month := xs:dayTimeDuration("P30D") 
let $month_ago := $now - $month 
return $month_ago 

输出:

2011-03-23T14:32:47.156-03:00 

在测试了撒克逊,Altova的,XQSharp。

http://www.w3.org/TR/xpath20/#mapping,这是操作员映射:

Operator | Type(A)    | Type(B)    | Function 
A - B | numeric    | numeric    | op:numeric-subtract(A, B) 
A - B | xs:date    | xs:date    | op:subtract-dates(A, B) 
A - B | xs:date    | xs:yearMonthDuration | op:subtract-yearMonthDuration-from-date(A, B) 
A - B | xs:date    | xs:dayTimeDuration | op:subtract-dayTimeDuration-from-date(A, B) 
A - B | xs:time    | xs:time    | op:subtract-times(A, B) 
A - B | xs:time    | xs:dayTimeDuration | op:subtract-dayTimeDuration-from-time(A, B)  
A - B | xs:dateTime   | xs:dateTime   | op:subtract-dateTimes(A, B) 
A - B | xs:dateTime   | xs:yearMonthDuration | op:subtract-yearMonthDuration-from-dateTime(A, B)  
A - B | xs:dateTime   | xs:dayTimeDuration | op:subtract-dayTimeDuration-from-dateTime(A, B)  
A - B | xs:yearMonthDuration | xs:yearMonthDuration | op:subtract-yearMonthDurations(A, B)` 
+0

感谢您的答案。我尝试更换第二行: 'let $ month:= xs:dayTimeDuration(“P30D”)' 并且得到相同的错误。有什么建议么? – 2011-04-22 17:03:47

+0

谢谢你扩大答案,但正如我所说,它仍然不可以在可可。 – 2011-04-22 18:00:43

1

此功能是XPath 2.0它似乎。也许你的处理器不支持这个?

执行您的查询here表明它确实是正确的。所以,与zorba它的作品...

+0

我正在使用Cocoa的NSXML,它根据文档“包括对XQuery 1.0和XPath 2.0的支持”。所以也许这是NSXML的XPath实现的问题?我用这个信息编辑了这个问题。 – 2011-04-22 17:07:44