如何在xpath中获取元素类型?
我的xml是:如何在xpath中获取元素类型?,xpath,xquery,Xpath,Xquery,我的xml是: <record> <field name="f1"/> <id name="f2"/> <id name="f3"/> <field name="f4"/> <info/> </record> 这可能吗?如何区分$i何时为id,何时为字段?您可以使用函数库或创建自己的用户定义函数。大概是这样的: for $i in $records/record/field | $recor
<record>
<field name="f1"/>
<id name="f2"/>
<id name="f3"/>
<field name="f4"/>
<info/>
</record>
这可能吗?如何区分
$i
何时为id,何时为字段?您可以使用函数库或创建自己的用户定义函数。大概是这样的:
for $i in $records/record/field | $records/record/id
return
if ( .... $i is id .... ) then .... do something .... else ... do something else ...
for $i in $records/record/field | $records/record/id
return
if (name($i)="id") then .... do something .... else ... do something else ...
record
field
id
id
field
info
查看
本地名称
XQuery功能-请参阅
给定一个节点或节点集,它应该为您提供节点的名称—标记的名称。我想这就是你想要的,对吧
例如,如果您这样做:
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)
我将使用self::id,而不是使用name()或local-name()进行尝试
if ($i[self::id]) then ... else ...
另一个简洁的XQuery解决方案是使用typeswitch:
for $i in $records/record/field | $records/record/id
return
typeswitch($i)
case element(id) return ...
case element(field) return ...
default return ...
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"
更简单、更像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返回的值合并。使用类型开关:
for $i in $records/record/field | $records/record/id
return
typeswitch($i)
case element(id) return ...
case element(field) return ...
default return ...
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"
let$record:=
创下$e的记录/*
返回
打字开关($e)
case元素(id)返回concat(“id”,$e/@name)
case元素(field)返回concat(“field”,$e/@name)
默认返回“其他”
我从未使用过XQuery,但在我看来,你可能指的是name($I)
而不是name($1)
,除非XQuery比我想象的更奇怪!谢谢,这绝对是我需要的。结果将是字段id,但我需要字段id。