计算节点中的 XQuery 包装结果

发布于 2024-09-24 01:39:15 字数 1230 浏览 0 评论 0原文

我正在尝试在 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>

I am trying to do some simple pagination in XQuery. I would like my root element of the returned XML to have (as attributes) various properties about the pagination (current page etc).

However I can't seem to find a way to add these dynamic attributes to my root element.
I've tried playing with the
element name {expr} and attribute name {expr}
functions, but can't seem to get them to work.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我是男神闪亮亮 2024-10-01 01:39:15

向根添加属性:

<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>)
...

这能回答您的问题吗?

to add an attribute to the root:

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

in your case you probably want to do something like: (?)

...
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>)
...

does that answer your question?

牵你的手,一向走下去 2024-10-01 01:39:15

我不认为这是正确的 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>

I don't think that is the proper XQuery way...

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

With this input:

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

With $requested-page-nbr set to 2 and $items-per-page set to 3, output:

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

With $requested-page-nbr set to 4 and $items-per-page set to 4, output:

<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>
压抑⊿情绪 2024-10-01 01:39:15

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

{($current)}

的情况下,我们使用类似以下的内容

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

As for returning a "page" of results, where you are using

{($current)}

we are using something like the following

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文