2014-12-03 163 views
0

我之前對這個問題有類似的問題,但我仍然沒有正確處理這種情況,首先我說我是這個XQuery語言的新手,因此配置遞歸策略對我來說現在真的很難。XQuery遞歸函數

XQuery來執行示例代碼:

declare variable $stuff := 
    <doc> 
    <embed-session> 
    <session> 
      <title>Fred Smith</title> 
    <session> 
    <title>Ahmet Özcan</title> 
    <session> 
    <title>Erman Bey</title> 
    </session> 
    </session> 
    </session> 
    </embed-session> 
    </doc>; 

declare function local:change($node as node()) as element() 
{ 
    typeswitch($node) 
    case element() return 
    element { fn:node-name($node) } { 
     attribute title {data($node/title)}, 
     $node/session ! local:change(.) 
    } 
    default return $node 
}; 

local:change($stuff/embed-session/session) 

The output of the code : 

<session title="Fred Smith"> 
    <session title="Ahmet Özcan"> 
    <session title="Erman Bey"/> 
    </session> 
</session> 

看來,它與我的預期符合,但如果我多了一個嵌入會話節點添加到我的東西變量,例如:

<embed-session> 
<session> 
<title>Ferhat Bey</title> 
</session> 
</embed-session> 

到我的函數參數如下: [XPTY0004]不能將item()序列作爲節點()處理:(...,)

預期的cod輸出E添加後下面提到的嵌入會話:

<session title="Fred Smith"> 
    <session title="Ahmet Özcan"> 
    <session title="Erman Bey"/> 
    </session> 
</session> 

<session title="Ferhat Bey"/> 

我知道這是序列,但爲什麼我不能指定序列節點作爲參數?

+1

請始終添加實際和預期的輸出以及發生的任何錯誤。代碼,這不起作用通常是你正在嘗試做什麼的一個不好的描述。 – 2014-12-03 08:42:49

+0

@JensErat我只是想描述我的目標,作爲一種算法,因爲主要的東西是我的語法和功能的返回類型,我嘗試了很多東西,我總是有例外,所以我不能把代碼我的例子,決定描述我需要的方式。 – Hayra 2014-12-03 09:00:52

+0

@Hayra Jens'已經說過,你的問題是缺乏信息。說實話,我不知道你在努力達成什麼,因此我無法幫助你。你沒有給出任何錯誤描述或描述你想要做什麼。正如你所說,你的語法對於xquery來說看起來非常不對,但我們怎麼能幫助你呢?如果您想了解完整的語法,您可能需要閱讀一本書或規範。 – dirkk 2014-12-03 09:04:19

回答

0

聲明函數參數的期望類型總是一個好主意。我認爲你期望$ node是一個節點,但在你的函數調用中,你提供了一系列節點。元素(x)僅匹配一個單例序列,因此當您提供多個序列時它不匹配。如果你寫了「$ node作爲node()」,那麼這個簡單的錯誤會被更快地捕獲,並且我們都會節省很多時間。

+0

首先非常感謝您的幫助,但實際上我對這種結構非常陌生,它確實給我帶來了很多麻煩。我認爲最好的方式來學習這個問這個問題,即使這似乎很容易... – Hayra 2014-12-03 13:47:26

+0

對不起,我不是故意要批評,我只是想提供有用的建議。 – 2014-12-04 16:06:28

+0

沒問題,所以如果可以的話,請問我最後一次編輯問題後能否幫助我?如果你的函數被寫入處理單個節點,那麼你不能用包含多個節點的序列調用它。 – Hayra 2014-12-05 14:48:16