【问题标题】:XQuery wrap result in computed nodeXQuery 将结果包装在计算节点中
【发布时间】:2013-07-04 05:58:41
【问题描述】:

我正在尝试在 XQuery 中进行一些简单的分页。我希望返回的 XML 的根元素具有(作为属性)关于分页(当前页面等)的各种属性。

但是我似乎找不到将这些动态属性添加到我的根元素的方法。 我试过玩 元素名称 {expr} 和属性名称 {expr} 功能,但似乎无法让它们工作。

<result>{

let $results :=
for $item in doc('mydoc')/root/item
return $item

let $requested-page-nbr := 2
let $items-per-page := 10
let $count := count($results)

let $last-page-nbr := fn:ceiling($count div $items-per-page)
let $actual-page-nbr := if ($requested-page-nbr gt $last-page-nbr) then $last-page-nbr else $requested-page-nbr
let $start-item := $items-per-page * $actual-page-nbr - ( $items-per-page - 1 )
let $natural-end-item := $actual-page-nbr * $items-per-page
let $actual-end-item := if ($count ge $natural-end-item) then $natural-end-item else $count

for $j in ($start-item to $actual-end-item )
let $current := item-at($results, $j)
return
 <document-summary
    requested-page-nbr="{$requested-page-nbr}"
    items-per-page="{$items-per-page}"
    count="{$count}"
    last-page-nbr="{$last-page-nbr}"
    actual-page-nbr="{$actual-page-nbr}"
    start-item="{$start-item}"
    natural-end-item="{$natural-end-item}"
    actual-end-item="{$actual-end-item}">
  {($current)}
 </document-summary>
}</result>

【问题讨论】:

    标签: xquery


    【解决方案1】:

    向根添加属性:

    <result>{attribute page {3}}</result>
    

    在您的情况下,您可能想要执行以下操作:(?)

    ...
    return ( 
      attribute page {$actual-page-nbr},
    
      for $j in ($start-item to $actual-end-item )
      let $current := item-at($results, $j)
      return
        <document-summary
           requested-page-nbr="{$requested-page-nbr}"
           items-per-page="{$items-per-page}"
           count="{$count}"
           last-page-nbr="{$last-page-nbr}"
           actual-page-nbr="{$actual-page-nbr}"
           start-item="{$start-item}"
           natural-end-item="{$natural-end-item}"
           actual-end-item="{$actual-end-item}">
         {($current)}
        </document-summary>)
    ...
    

    这能回答你的问题吗?

    【讨论】:

      【解决方案2】:

      我认为这不是正确的 XQuery 方式...

      这个 XQuery:

      declare variable $requested-page-nbr external;
      declare variable $items-per-page external;
      declare variable $items := /root/item;
      declare variable $firsties := $items[position() mod $items-per-page = 1];
      for $first in $firsties 
      let $actual-page-nbr := index-of($firsties,$first)
      let $group := $first|
                    $first/following-sibling::item[position() < $items-per-page]
      let $previous := ($actual-page-nbr - 1) * $items-per-page
      where $actual-page-nbr = $requested-page-nbr
      return
      <result>
          <document-summary requested-page-nbr="{$requested-page-nbr}" 
                            items-per-page="{$items-per-page}" 
                            count="{count($items)}" 
                            last-page-nbr="{count($firsties)}" 
                            actual-page-nbr="{$actual-page-nbr}" 
                            start-item="{$previous + 1}" 
                            natural-end-item="{$previous + $items-per-page}" 
                            actual-end-item="{$previous + count($group)}">{ 
             $group 
         }</document-summary> 
      </result> 
      

      有了这个输入:

      <root>
          <item>1</item>
          <item>2</item>
          <item>3</item>
          <item>4</item>
          <item>5</item>
          <item>6</item>
          <item>7</item>
          <item>8</item>
          <item>9</item>
          <item>10</item>
          <item>11</item>
          <item>12</item>
          <item>13</item>
      </root>
      

      $requested-page-nbr 设置为 2,$items-per-page 设置为 3,输出:

      <result>
          <document-summary requested-page-nbr="2"
                            items-per-page="3"
                            count="13"
                            last-page-nbr="5"
                            actual-page-nbr="2"
                            start-item="4"
                            natural-end-item="6"
                            actual-end-item="6">
              <item>4</item>
              <item>5</item>
              <item>6</item>
          </document-summary>
      </result>
      

      $requested-page-nbr 设置为 4,$items-per-page 设置为 4,输出:

      <result>
          <document-summary requested-page-nbr="4"
                            items-per-page="4"
                            count="13"
                            last-page-nbr="4"
                            actual-page-nbr="4"
                            start-item="13"
                            natural-end-item="16"
                            actual-end-item="13">
              <item>13</item>
          </document-summary>
      </result>
      

      【讨论】:

        【解决方案3】:

        至于返回结果的“页面”,您在哪里使用

        {($current)}

        我们正在使用类似下面的东西

        { subsequence($results, $start-item, $items-per-page) }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-21
          • 1970-01-01
          • 2018-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多