2010-03-05 45 views
4

我的XML是:如何在xpath中獲取元素類型?

<record> 
    <field name="f1"/> 
    <id name="f2"/> 
    <id name="f3"/> 
    <field name="f4"/> 
    <info/> 
</record> 

我通過它要循環XQuery中是這樣的:

for $i in $records/record/field | $records/record/id 
return 
    if (.... $i is id ....) then .... do something .... else ... do something else ... 

這可能嗎?如何區分$i是id還是field?

回答

4

另一個優秀的XQuery解決方案是使用typeswitch:

for $i in $records/record/field | $records/record/id 
return 
    typeswitch($i) 
    case element(id) return ... 
    case element(field) return ... 
    default return ... 
+0

謝謝,這絕對是我需要的。 – danatel 2010-03-05 19:03:48

0

您可以使用函數庫或創建自己的用戶定義函數。事情是這樣的:

for $i in $records/record/field | $records/record/id 
return 
    if (name($i)="id") then .... do something .... else ... do something else ... 

http://www.xqueryfunctions.com/xq/fn_name.html

+0

我從來沒有使用XQuery的,但它看起來像你對我可能意味着'名($ I)'而不是'名($ 1)',除非XQuery是更加古怪比它看起來我! – 2010-03-05 06:33:13

+0

是的,錯字 - 謝謝! – brendan 2010-03-05 14:29:47

0

退房的local-name XQuery函數 - 看MSDN docs here

給定一個節點或節點集,它應該給你節點的名稱 - 標記的名稱。我想這就是你要找的,對嗎?

E.g.如果你這樣做:

DECLARE @input XML = '<record> 
    <field name="f1"/> 
    <id name="f2"/> 
    <id name="f3"/> 
    <field name="f4"/> 
    <info/> 
</record>' 

SELECT 
    inp.nod.query('local-name(.)') 
FROM 
    @input.nodes('//*') AS inp(nod) 

你得到這樣的輸出:

record 
field 
id 
id 
field 
info 
1

與名稱()或本地名稱的嘗試,而不是()我會使用自:: ID例如

if ($i[self::id]) then ... else ... 
0

怎麼樣的東西更簡單,更XQuery的樣

for $i in $records/record/field return do something with field, 
for $i in $records/record/id return do something with id 

在這種情況下,返回的第一個值將與第二個值合併爲。

+0

結果將是field-field-id-id,但我想要field-id-id-field。 – danatel 2010-03-09 19:54:53

0

使用typeswitch:

let $record := 
<record> 
    <field name="f1"/> 
    <id name="f2"/> 
    <id name="f3"/> 
    <field name="f4"/> 
    <info/> 
</record> 

for $e in $record/* 
return 
    typeswitch ($e) 
    case element(id) return concat("id",$e/@name) 
    case element (field) return concat("field",$e/@name) 
    default return "other"