XQuery方法,试图对从xml读取的值求和

时间:2009-12-11 06:37:49

标签: xquery

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

这是我的功能:

bool
example(Zorba* aZorba)
{
   XQuery_t lQuery = aZorba->compileQuery(
                        "for $i in fn:doc('/tmp/products.xml')//time"
                         "let $sum := xs:integer($i)"
                                 " return $sum"
);

  DynamicContext* lCtx = lQuery->getDynamicContext();

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

  try {
    std::cout << lQuery << std::endl;
  } catch (DynamicException& e) {
    std::cerr << e.getDescription() << std::endl;
    return false;
  } catch (StaticException& f){
        std::cerr << f.getDescription() << f.getErrorCodeAsString(f.getErrorCode()) << std::endl;
        return false;
  }
}

使用适当的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 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 3 3 3 3 3 3 3 3 3 ....

输入文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<temps>
  <temp>
    <time>0</time>
    <lat>0</lat>
    <long>0</long>
    <value>0</value>
  </temp>
  <temp>
    <time>1</time>
    <lat>0</lat>
    <long>1</long>
    <value>0</value>
  </temp>
 ...

2 个答案:

答案 0 :(得分:1)

看起来你想要使用fn:sum

像这样:

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

此处提供更多信息:http://www.xqueryfunctions.com/xq/fn_sum.html

答案 1 :(得分:0)

我自己是XQuery的相对新手,但我感到惊讶的一件事是缺少map()函数,就像在LISP中一样,采用一系列值并将它们合并为一个,传入组合功能。在LISP中,我认为你想要的是“(地图'+(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(对于$ i in fn:doc()...)”。基本上,这会重新创建您提到的sum()函数,但现在您可以进行所需的更改。