Как получить тип элемента в xpath? - PullRequest
4 голосов
/ 05 марта 2010

Мой xml:

<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 это идентификатор, а когда это поле?

Ответы [ 6 ]

4 голосов
/ 05 марта 2010

Другое удобное решение XQuery - использование переключателя типов:

for $i in $records/record/field | $records/record/id
return
  typeswitch($i)
  case element(id) return ...
  case element(field) return ...
  default return ...
2 голосов
/ 05 марта 2010

Вместо этих попыток с помощью name () или local-name () я бы использовал self :: id, например.

if ($i[self::id]) then ... else ...
0 голосов
/ 26 апреля 2010

Использовать переключатель типов:

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"
0 голосов
/ 09 марта 2010

Как насчет чего-то более простого и более похожего на XQuery

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

В этом случае значения, возвращаемые первым значением for, будут объединены со значениями из второго значения for.

0 голосов
/ 05 марта 2010

Ознакомьтесь с функцией local-name XQuery - см. Документы MSDN здесь .

Учитывая узел или набор узлов, он должен дать вам имя узла - имя тега. Я думаю, это то, что вы ищете, верно ??

например. если вы сделаете это:

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
0 голосов
/ 05 марта 2010

Вы можете использовать библиотеку функций или создать свою собственную пользовательскую функцию. Примерно так:

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

...