Xquery 返回不同节点的属性时出错

Xquery 返回不同节点的属性时出错,xquery,basex,Xquery,Basex,我的xml文件符合以下DTD: <!ELEMENT eprints (paper+)> <!ELEMENT paper (eprintsid,userid,dir,datestamp,type,author+,title)> <!ELEMENT eprintsid (#PCDATA)> <!ELEMENT userid (#PCDATA)> <!ELEMENT dir (#PCDATA)> <!ELEMENT datestamp

我的xml文件符合以下DTD:

<!ELEMENT eprints (paper+)>
<!ELEMENT paper (eprintsid,userid,dir,datestamp,type,author+,title)>
<!ELEMENT eprintsid (#PCDATA)>
<!ELEMENT userid (#PCDATA)>
<!ELEMENT dir (#PCDATA)>
<!ELEMENT datestamp (#PCDATA)>
<!ELEMENT type (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>

<!ATTLIST author id CDATA #REQUIRED>

从这个xml文件中,我想生成一个包含所有不同值的节点列表,其中包含作者的文本节点,这些节点匹配多个id值,多个id作为子节点

因此,我尝试使用以下xquery:

let $doc := doc("eprints")
for $i in distinct-values($doc//author)
let $jn := $i/@id
where (count(distinct-values($jn)) > 1)
return <idByAuthor>{$jn}</idByAuthor>
let$doc:=doc(“eprints”)
对于不同值的$i($doc//author)
让$jn:=$i/@id
其中(计数(不同值($jn))>1)
返回{$jn}
显然,XQuery不允许我遍历到
$i
的“id”属性节点,因为我(从我的xml数据库引擎BaseX)得到了以下错误: '上下文节点是'@id'所必需的;xs:未找到非类型数据组。“

有人知道为什么我无法访问
$I
的id属性吗?

返回一组原子值(例如,数字和字符串),而不是XML节点。不能从这些轴执行轴步进

从这个xml文件中,我想生成所有节点的列表 与多个id值匹配的作者的不同值文本节点, 将多个id作为子节点

这不是你想要解决的问题,这是你试图解决它的方式。我想你应该询问所有提供了不止一篇论文的作者(或者他们是什么作者)。如果我猜错了,请准确地写下你的查询应该做什么

尝试遵循此草图(XQuery尚未生效):

适用于所有作者$a
其中包含作者$a的所有论文的计数
返回{$a/@id}
如果您需要有关此查询的更多帮助,请发布一些示例XML代码片段以供使用,如果您有一些用于此查询的代码以及所需的输出


明确问题代码:

for $author in distinct-values($doc//author)
let $ids := $doc//author[data()=$author]/@id/data()
where count($ids) > 1
return
  <author name="{ $author }">
  {
    for $id in $ids
    return <id>{ $id }</id>
  }
  </author>
不同值($doc//author)中的$author的

让$ids:=$doc//author[data()=$author]/@id/data()
其中count($id)>1
返回
{
对于$id中的$id
返回{$id}
}

您可能想看看XQuery 3.0引入的
group by
表达式(请参阅)

Group by允许您执行基于值的分组,因此您可以执行以下操作:

let$authors:=
福…不管怎样…
福…不管怎样…
福…不管怎样…
酒吧……随便…
酒吧……随便…
FooBar…不管怎样…
(:或使用doc('eprints')//作者:)
返回
{
对于$authors//author中的$author
按$name分组:=$author/name
返回
如果(计数(不同值($author/@id))>1,则
元素{“作者”}
{ 
属性{“name”}{$name},
对于不同值中的$id($author/@id)
返回{$id}
}
else()
}
我希望这会有所帮助,否则请随意发布XML文件的一小部分

问候
Michael

感谢您对distinct-values()的澄清,这解释了我遇到的错误。我的最终目标如下:-每个author节点的textnode中包含作者的姓名,id属性节点中包含作者的id。我想知道哪些作者姓名出现在具有多个不同id的xml文件中,此外,我还想知道哪些id值用于此作者姓名(最好在一个查询中)。请使用此信息更新您的问题。我在我的答案中添加了一些代码。请提供一个小的真正的XML文档——这将为任何愿意查看和理解您的问题的人节省时间。请编辑问题并更正。
for $author in distinct-values($doc//author)
let $ids := $doc//author[data()=$author]/@id/data()
where count($ids) > 1
return
  <author name="{ $author }">
  {
    for $id in $ids
    return <id>{ $id }</id>
  }
  </author>
let $authors := 
<authors>
  <author id="a"><name>Foo</name>…whatever…</author>
  <author id="b"><name>Foo</name>…whatever…</author>
  <author id="a"><name>Foo</name>…whatever…</author>
  <author id="c"><name>Bar</name>…whatever…</author>
  <author id="d"><name>Bar</name>…whatever…</author>
  <author id="f"><name>FooBar</name>…whatever…</author>  
</authors> (: or use doc('eprints')//author :)
return
<distinct-names> {
  for $author in $authors//author
  group by $name := $author/name
  return
    if(count(distinct-values($author/@id)) > 1) then
      element {"author"}
              { 
                attribute {"name"} {$name},
                for $id in distinct-values($author/@id)
                return <id>{$id}</id>
              }
    else ()  
}</distinct-names>