2010-09-14 6 views
0

J'essaye de faire une pagination simple dans XQuery. Je voudrais que mon élément racine du XML renvoyé ait (en tant qu'attributs) différentes propriétés concernant la pagination (page courante, etc.).XQuery wrap résultat dans le noeud calculé

Cependant, je n'arrive pas à trouver un moyen d'ajouter ces attributs dynamiques à mon élément racine. J'ai essayé de jouer avec le nom de l'élément {expr} et le nom de l'attribut {expr} fonctions, mais n'arrive pas à les faire fonctionner.

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

Répondre

0

pour ajouter un attribut à la racine:

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

dans votre cas, vous voulez sans doute faire quelque chose comme: (?)

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

que cela répond à votre question?

0

Je ne pense pas que ce soit la bonne façon XQuery ...

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

Avec cette entrée:

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

Avec $ demandé page-nbr défini sur 2 et $ articles par page sur 3, sortie:

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

Avec $ set demandé pages-nbr à 4 et défini 4 produits par page $, sortie:

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

En ce qui concerne le retour d'une "page" de résultats, où vous utilisez

{($ courant)}

nous utilisons quelque chose comme ce qui suit

{suite (résultats $, démarrage article $, articles par page $)}

Questions connexes