Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在xpath中获取元素类型?_Xpath_Xquery - Fatal编程技术网

如何在xpath中获取元素类型?

如何在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

我的xml是:

<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。