XQuery元素構造,直接構造和計算構造

2021-06-22 14:35:58 字數 2141 閱讀 2481

今天遇到乙個問題,對於下面這樣乙個xml串

告警流水號

alarmid

gj_2816071613_352385154_2970760107_588354443

告警id

alarmstaid

2014070200101

如何轉換成下面這種形式:

gj_2816071613_352385154_2970760107_588354443

2014070200101

根據之前在專案中配置各種解析指令碼的經驗,我的直覺告訴我通過xquery指令碼,是可以實現這麼乙個轉換過程,而且,之前在看《xquery權威指南》一書時,曾看到類似的例子,於是我翻開《xquery權威指南》,根據目錄提示,很快我就找到了解決辦法,很簡單,就是使用xquery構造元素。

使用xquery構造元素,有兩種方式:直接元素構造(direct element construction)和計算構造(computed construction),下面來分別介紹:

這種構造方式比較簡單,比較容易理解。根據書中的描述「直接構造器,使用類似xml語法,用於建立名稱固定的元素和屬性。」當初看這句話,並沒有給予太多關注,「使用類似xml語法」我感覺這是廢話,而後面「

用於建立名稱固定的元素和屬性

」這句話則直接被我忽視了。而在解決上面的問題時,我才意識到這句話的重要性。作者的意思是,直接元素構造,適合使用與節點名稱和屬性名稱已知的元素構造,而在我們遇到的問題中,節點的名稱是未知的,因此不能使用直接元素構造的方式進行。說到現在,可能大家還不知道直接元素構造是怎麼一回事,舉兩個栗子吧。

}

在stylus-studio中針對問題中的xml串執行上面的指令碼,得到如下結果:

alarmid

alarmstaid

可以看到在這裡,節點opdetail,recordinfo以及name的名稱都是固定的。

再比如

}

在stylus-studio中針對問題中的xml串執行上面的指令碼,得到如下結果:

alarmid

alarmstaid

同理,這裡的屬性名稱fieldchname也是固定的。

和直接元素構造不同,書中對計算構造器的描述是「允許在查詢中動態生成名稱。」

計算元素構造器,使用關鍵字element,後面跟著名稱和內容。其中名稱可以是字串,也可以是用大括號括起來的名稱表示式,而內容則必須是名稱表示式。

語法如下:element 名稱/名稱表示式  內容表示式

最簡單的構造方式,和上面的直接元素構造方法沒什麼差別,將節點的名稱固定:

element html 

}

執行之後,返回的結果是

如果針對問題中的xml串,執行下面的語句

element opdetail  

}

返回的結果是

gj_2816071613_352385154_2970760107_588354443

2014070200101

此外,還可以這樣,節點名稱使用固定字串+運算結果的方式進行,同樣對問題中的xml文,執行下面的語句:

element opdetail  

}

返回的結果是

gj_2816071613_352385154_2970760107_588354443

2014070200101

更多的栗子就不多介紹了,翻開《xquery權威指南》第五章,你可以找到很多栗子。

總的說來,xquery元素構造,分為直接構造和計算構造,其中直接元素構造適用於節點/屬性名稱不變的情況,而計算構造適用於節點/屬性名稱可變的情況。

基類構造和派生構造

基類的建構函式不能被繼承,在宣告派生類時,對繼承過來的成員變數的初始化工作也要由派生類的建構函式來完成。所以在設計派生類的建構函式時,不僅要考慮派生類新增的成員變數,還要考慮基類的成員變數,要讓它們都被初始化。解決這個問題的思路是 在執行派生類的建構函式時,呼叫基類的建構函式。下面的例子展示了如何在...

建構函式和拷貝建構函式

建構函式 簡單地說建構函式是類函式,函式名與類名完全相同,無返回值 建構函式屬於類的成員函式,除了具有一般成員函式的特點外,還具有自己的特點 1 是類的乙個特殊的成員函式,函式名與類名相同 2 訪問屬性應該是public 3 功能是初始化物件,在建構函式中一般不作初始化以外的事情 4 可以在類內定義...

拷貝建構函式和賦值構造

為什麼空類可以建立物件呢?複製建構函式的引數可以是 const 引用,也可以是非 const 引用。一般使用前者,這樣既能以常量物件 初始化後值不能改變的物件 作為引數,也能以非常量物件作為引數去初始化其他物件。乙個類中寫兩個複製建構函式,乙個的引數是 const 引用,另乙個的引數是非 const...