0

我对 XQuery 很陌生,我正在尝试编写一个我无法开始工作的示例函数。我想读取一个 xml 文件,解析出“时间”值,在读取它们时对它们求和并返回总和。这是微不足道的,我希望在其中构建更多功能,但我想先让它工作。另外,我知道 XQuery 中有一个“sum”指令可以做到这一点,但我想向它添加更多内容,因此内置 sum 不足以满足我的需要。

这是我的功能:

布尔
示例(Zorba* aZorba)
{
   XQuery_t lQuery = aZorba->compileQuery(
                        "for $i in fn:doc('/tmp/products.xml')//time"
                         “让 $sum := xs:integer($i)”
                                 “返回$总和”
);

  DynamicContext* lCtx = lQuery->getDynamicContext();

  lCtx->setContextItemAsDocument("temp_measurements.xml", lDocStream);

  尝试 {
    std::cout << lQuery << std::endl;
  } 捕捉(动态异常和 e){
    std::cerr << e.getDescription() << std::endl;
    返回假;
  } 捕捉 (StaticException& f){
        std::cerr << f.getDescription() << f.getErrorCodeAsString(f.getErrorCode()) << std::endl;
        返回假;
  }
}

使用适当的 main() 调用它。如果我注释掉以“let $sum ...”开头的行,那么它的工作原理是它将时间值作为一系列整数返回,如下所示:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3....

输入文件如下所示:

<?xml 版本="1.0" 编码="UTF-8"?>
<临时>
  <温度>
    <时间>0</时间>
    <lat>0</lat>
    <long>0</long>
    <值>0</值>
  </temp>
  <温度>
    <时间>1</时间>
    <lat>0</lat>
    <long>1</long>
    <值>0</值>
  </temp>
 ...
4

2 回答 2

1

看起来你想使用 fn:sum

像这样:

fn:sum(
    (
        1, 1, 1, 1, 0, 0, 1, 0
    ), 
    0
)

更多信息在这里:http ://www.xqueryfunctions.com/xq/fn_sum.html

于 2010-04-01T15:05:38.053 回答
0

我自己是 XQuery 的新手,但令我感到惊讶的一件事是缺少 map() 函数,就像在 LISP 中一样,它可以获取一系列值并将它们组合成一个,并传入组合函数. 在 LISP 中,我想你会想要像“(map '+(0 0 0 1 1 2 2 3 1 2))”这样的东西。您可以在 XQuery 中执行类似的操作,但您必须自己编写:

declare function local:sum-times($seq)
{
  if (count($seq) < 2)
  then
    subsequence($seq, 1, 1)
  else
    subsequence($seq, 1, 1) + local:sum-times(subsequence($seq, 2))
};

那么你可以写“local:sum-times(for $i in fn:doc()...)”。基本上,这会重新创建您提到的 sum() 函数,但现在您可以进行所需的更改。

于 2009-12-23T20:11:58.757 回答