2010-03-05 4 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 일 때와 필드 일 때를 어떻게 구별 할 수 있습니까?

답변

4

또 다른 깔끔한 XQuery를 솔루션은 typeswitch을 사용하는 것입니다

이 경우 간단하게 뭔가 더 XQuery를 같은

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

에 대해, 값가 처음에 의해 반환 방법

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

고마워,이게 내가 필요한거야. – danatel

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)를 의미 할 수 있습니다처럼 XQuery를도 괴상 경우를 제외하고는, 오히려'이름 ($ 1)'보다'나에게 보인다 그게 내게 보이는 것보다! –

+0

예, 오타 - 감사합니다! – brendan

0

체크 아웃 local-name XQuery 함수를 - MSDN docs here를 참조하십시오.

노드 또는 노드 집합이 주어지면 노드 이름 - 태그 이름을 제공해야합니다. 나는 그것이 당신이 찾고있는 것이라고 생각합니다, 맞습니까?

예. 이 작업을 수행 할 경우 :

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

2nd의 값과 병합됩니다.

+0

결과는 field-field-id-id이지만 field-id-id-field가 필요합니다. – danatel

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" 
관련 문제