2017-01-10 3 views
0

Ceci est mon deuxième article seulement et j'espère que vous pourrez m'aider. J'ai trouvé des questions similaires, mais soit ils étaient légèrement différents, soit je suis incapable de transférer les solutions à mon problème.XQuery: Regroupement par un élément et calculs basés sur des éléments qui ont les mêmes critères de regroupement

J'ai la source suivante:

<?xml version="1.0" encoding="UTF-8"?> 
<goods> 
    <item> 
     <groupIdentification>001</groupIdentification> 
     <measures> 
      <measure type="piece"> 
       <value>100</value> 
       <unit>PK</unit> 
      </measure> 
      <measure type="weight"> 
       <value>100</value> 
       <unit>KG</unit> 
      </measure> 
     </measures> 
    </item> 
    <item> 
     <groupIdentification>002</groupIdentification> 
     <measures> 
      <measure type="piece"> 
       <value>200</value> 
       <unit>PK</unit> 
      </measure> 
      <measure type="weight"> 
       <value>200</value> 
       <unit>KG</unit> 
      </measure> 
     </measures> 
    </item> 
    <item> 
     <groupIdentification>001</groupIdentification> 
     <measures> 
      <measure type="piece"> 
       <value>300</value> 
       <unit>PK</unit> 
      </measure> 
      <measure type="weight"> 
       <value>300</value> 
       <unit>KG</unit> 
      </measure> 
     </measures> 
    </item> 
</goods> 

Sur la base de la valeur d'identification de groupe distinct Je veux produire une instance d'un <groupedItem>. Dans le <groupedItem> Je veux faire référence à la <groupIdentification> (mais une seule valeur) et résumer différentes mesures, ou toute autre valeur, qui partagent le même groupe d'identification.

La structure cible que je veux atteindre est donc:

<?xml version="1.0" encoding="UTF-8"?> 
<goods> 
    <groupedItem> 
     <groupIdentification>001</groupIdentification> 
     <measures> 
      <measure type="piece"> 
       <value>400</value> 
       <unit>PK</unit> 
      </measure> 
      <measure type="weight"> 
       <value>400</value> 
       <unit>KG</unit> 
      </measure> 
     </measures> 
    </groupedItem> 
    <groupedItem> 
     <groupIdentification>002</groupIdentification> 
     <measures> 
      <measure type="piece"> 
       <value>200</value> 
       <unit>PK</unit> 
      </measure> 
      <measure type="weight"> 
       <value>200</value> 
       <unit>KG</unit> 
      </measure> 
     </measures> 
    </groupedItem> 
</goods> 

S'il vous plaît aidez-moi à expliquer comment je peux y parvenir et ce que le mécanisme est. J'ai un peu de mal à dire à la requête de résumer des choses qui partagent le même "élément de regroupement".

Merci d'avance.

EDIT

Si j'utilise la requête suivante, je ne reçois que 2 groupedItems, mais je ne continue dans les niveaux inférieurs.

xquery version "3.0"; 
<goods> 
{ 
for $item in goods/item 
let $group := $item/groupIdentification 
group by $group 
return 
<groupedItem> 
    { 
    for $groupIdentification in goods/item/groupIdentification 
    (: this is where I fail to get the connection :) 
    return 
    <groupIdentification>{ data($groupIdentification) }</groupIdentification> 
    } 
    (: no need for measure here yet, first need to solve the problem itself :) 
</groupedItem> 
} 
</goods> 

je reçois:

<?xml version="1.0" encoding="UTF-8"?> 
<goods> 
<groupedItem> 
    <groupIdentification>001</groupIdentification><groupIdentification>002</groupIdentification><groupIdentification>001</groupIdentification> 
</groupedItem> 
<groupedItem> 
    <groupIdentification>001</groupIdentification><groupIdentification>002</groupIdentification><groupIdentification>001</groupIdentification> 
</groupedItem> 
</goods> 
+0

XQuery est maintenant à la version 3.0/3.1 qui a une clause 'group' alors avez-vous essayé d'utiliser cela? S'il vous plaît montrer votre code XQuery. –

+0

'groupe par', c'est;) https://www.w3.org/TR/xquery-30/#id-group-by – joewiz

+0

Merci pour vos réponses jusqu'à présent. S'il vous plaît voir mes explications supplémentaires. Le regroupement fonctionne au niveau supérieur, mais je ne sais pas comment continuer à traiter les niveaux inférieurs en conséquence. – PatrickSchenker

Répondre

1

... mais je ne continue dans les niveaux inférieurs

Vous devez groupe une deuxième fois. Vous pouvez également regrouper unit en plus de @type.

... Exemple

XML Entrée (modifié pour introduire une seconde unité)

<goods> 
    <item> 
     <groupIdentification>001</groupIdentification> 
     <measures> 
      <measure type="piece"> 
       <value>100</value> 
       <unit>PK</unit> 
      </measure> 
      <measure type="weight"> 
       <value>220</value> 
       <unit>LB</unit> 
      </measure> 
      <measure type="weight"> 
       <value>100</value> 
       <unit>KG</unit> 
      </measure> 
     </measures> 
    </item> 
    <item> 
     <groupIdentification>002</groupIdentification> 
     <measures> 
      <measure type="piece"> 
       <value>200</value> 
       <unit>PK</unit> 
      </measure> 
      <measure type="weight"> 
       <value>200</value> 
       <unit>KG</unit> 
      </measure> 
     </measures> 
    </item> 
    <item> 
     <groupIdentification>001</groupIdentification> 
     <measures> 
      <measure type="piece"> 
       <value>300</value> 
       <unit>PK</unit> 
      </measure> 
      <measure type="weight"> 
       <value>300</value> 
       <unit>KG</unit> 
      </measure> 
      <measure type="weight"> 
       <value>661</value> 
       <unit>LB</unit> 
      </measure> 
     </measures> 
    </item> 
</goods> 

XQuery 3,0

xquery version "3.0"; 
<goods>{ 
for $item in /goods/item 
let $key := $item/groupIdentification 
group by $key 
order by $key 
return 
<groupedItem> 
    <groupIdentification>{$key}</groupIdentification> 
    <measures>{ 
    for $measure in $item/measures/measure 
    let $type := $measure/@type 
    let $unit := $measure/unit 
    group by $type,$unit 
    order by $type,$unit 
    return 
     <measure type="{$type}">{ 
     <value>{sum($measure/value)}</value>, 
     <unit>{$unit}</unit> 
     }</measure> 
    }</measures> 
</groupedItem> 
}</goods> 

sortie

<goods> 
    <groupedItem> 
     <groupIdentification>001</groupIdentification> 
     <measures> 
     <measure type="piece"> 
      <value>400</value> 
      <unit>PK</unit> 
     </measure> 
     <measure type="weight"> 
      <value>400</value> 
      <unit>KG</unit> 
     </measure> 
     <measure type="weight"> 
      <value>881</value> 
      <unit>LB</unit> 
     </measure> 
     </measures> 
    </groupedItem> 
    <groupedItem> 
     <groupIdentification>002</groupIdentification> 
     <measures> 
     <measure type="piece"> 
      <value>200</value> 
      <unit>PK</unit> 
     </measure> 
     <measure type="weight"> 
      <value>200</value> 
      <unit>KG</unit> 
     </measure> 
     </measures> 
    </groupedItem> 
</goods>