在xQuery中使用属性名称

时间:2010-06-23 20:49:51

标签: xml xquery

我有这个Xml:

<Item key = "id">
   <SubItem id = "1" a = "2"/>
   <SubItem id = "1" b = "3"/>
   <SubItem x = "1"/>
   <SubItem y = "1"/>
   <SubItem z = "1"/>
</Item>

我希望选择具有名称等于(。)键的的属性的子项目

我想要一个返回此内容的查询:

<SubItem id = "1" a = "2"/>
<SubItem id = "1" b = "3"/>

所以我试过了:

let $x := ... my xml here...
let $key = $x/@id

return $x/*/@*[name(.) = $key]/..

这有效......

但是我想要更简洁的东西:

let $x := ... my xml here...
let $key = $x/@id

return $x/*/@$key

问题是,该代码无法编译,因为它不会让我在@之后使用非文字(或通配符)。

真的不可能吗?在此先感谢!!

1 个答案:

答案 0 :(得分:1)

您没有提到您正在使用的系统,但有一种MarkLogic具体的方法可以执行此操作:

let $data :=
  <Item key = "id">
   <SubItem id = "1" a = "2"/>
   <SubItem id = "1" b = "3"/>
   <SubItem x = "1"/>
   <SubItem y = "1"/>
   <SubItem z = "1"/>
  </Item>
let $path := fn:concat("$data/SubItem[exists(./@", fn:data($data/@key), ")]")
return xdmp:value($path)

据我所知,标准XQuery没有比你做的更简单的方法。其他系统可能具有类似的扩展。