xquery distinct-values和group by并选择xquery 1.0

时间:2017-06-16 20:17:12

标签: xquery

我有一个结构,然后具有相同值的元素,但任何元素都会更改该值。 我需要对信息进行分组并安装输出。

   <root>
        <cadastro>
            <id>2</id>
            <nome>abcd</nome>
            <links>
                <link>example7</link>
            </links>
        </cadastro>
        <cadastro>
            <id>2</id>
            <nome>abc</nome>
            <links>
                <link>example5</link>
                <link>example3</link>
            </links>
        </cadastro>
        <cadastro>
            <id>5</id>
            <nome>xpto</nome>
            <links>
                <link>example1</link>
            </links>
        </cadastro>
    </root>

我必须只返回2个输出

<results>
        <result>
            <idResult>2</idResult>
            <nome>abc</nome>
            <links>
                <url>example7</url>
                <url>example5</url>
                <url>example3</url>
            </links>
        </result>
        <result>
            <idResult>5</idResult>
            <nome>xpto</nome>
            <links>
                <url>example1</url>
            </links>
         </result>
    <results>

我尝试使用distinct-values,但我在有效负载上有相同id的不同值。 我怎样才能在xquery 1.0上分组?

1 个答案:

答案 0 :(得分:0)

您可以使用distinct-values迭代唯一ID,并查询具有该ID的每个匹配元素。

但是,请注意此输出中的一个区别:匹配<nome>的元素的2值不同,您的示例仅返回其中一个。但目前尚不清楚哪一个是正确的,所以这个解决方案输出两者。如果您只想要一个匹配,那么您需要添加一个约束,这可能就像($id-results/nome)[1]一样简单,但不能保证会选择您想要的约束。

element results {
  let $ids := $data/cadastro/id
  for $id in distinct-values($ids)
  let $id-results := $data/cadastro[id = $id]
  return element result {
    element idResult { $id },
    $id-results/nome,
    element links {
      $id-results/links/link
    }
  }

=&GT;

<results>
  <result>
    <idResult>2</idResult>
    <nome>abcd</nome>
    <nome>abc</nome>
    <links>
      <link>example7</link>
      <link>example5</link>
      <link>example3</link>
    </links>
  </result>
  <result>
    <idResult>5</idResult>
    <nome>xpto</nome>
    <links>
      <link>example1</link>
    </links>
  </result>
</results>