2009-12-11 29 views
0

我對XQuery來說很新,而且我正試圖編寫一個我無法工作的示例函數。 我想讀取一個xml文件,解析出「時間」值,在讀取它們時求和並返回總和。 這是微不足道的,我正在尋求建立更多的功能,但我想先得到這個工作。 另外,我知道在XQuery中有一個「sum」指令,它可以做到這一點,但我想增加更多的指令,所以內置的和不足以滿足我的需求。XQuery方法,試圖總結從xml中讀取的值

這裏是我的功能:

 
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; 
    } 
} 

它用合適的主稱爲()。如果我註釋掉開始「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 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> 
... 

回答

0

我我自己是XQuery的一個相對新手,但我感到驚訝的是,缺少像LISP那樣的map()函數來獲取一系列值並將它們合併爲一個值,並傳入組合函數。在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)) 
}; 

,那麼你可以寫「地方:總和倍(爲$ i的FN:(DOC)......)」。基本上,這會重新創建您提到的sum()函數,但現在您可以進行所需的更改。