xquery count для выражений в a для выражений - PullRequest
0 голосов
/ 15 октября 2019

вопрос в том, как я могу сосчитать выражения for в выражениях for с неизвестным родителем.

Код:

let $act :=(
<act time="1231">
     <data value="2">hello</data>
     <data value="2">hello</data>
     <data value="2">hello</data>
     <data value="2">hello</data>
     <data value="2">hello</data>
     <data value="2">hello</data>
</act>,
<act time="51292">
 <state>
     <data value="2">world</data>
     <data value="2">world</data>
     <data value="2">world</data>
     <data value="2">world</data>
     <data value="2">world</data>
 </state>
</act>,
<act time="41212">
 <state1>
    <state2>
     <data value="2">3</data>
     <data value="2">3</data>
     <data value="2">3</data>
     <data value="2">3</data>
     <data value="2">3</data>
    </state2>
 </state1>
</act>
)

for $data in $act
return
<act time ="{$data/@time}">
    {
    for $count at $cnt in $act//data
    where $count/.. is $data
    return
    <data value ="{$count}">{$cnt}</data>

    }
</act>

Результаты:

<act time="1231">
   <data value="hello">1</data>
   <data value="hello">2</data>
</act>
<act time="51292"/>
<act time="41212"/>

Ожидается:

<act time="1231">
   <data value="hello">1</data>
   <data value="hello">2</data>
</act>,
<act time="51292">
   <data value="world">3</data>
   <data value="world">4</data>
</act>,
<act time="41212">
   <data value="3">5</data>
   <data value="3">6</data>
</act>

также ссылка на код, который показывает, что является результатом и чего я ожидаю https://xqueryfiddle.liberty -development.net / pPgCcoE / 11

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Я думаю, вы просто хотите изменить предложение where, чтобы использовать where $count/ancestor::act is $data, то есть проверить, является ли элемент-предок act элементом, связанным с переменной $data внешнего выражения for.

0 голосов
/ 16 октября 2019

В вашем коде, когда вы выполняете итерации по элементу, они обрабатываются как разные фрагменты. Поэтому сначала вы должны объединить все действия в одну разметку, поскольку я использую элемент mainact. Вторая проблема - когда вы выполняете итерацию по элементу акта, он всегда начинает считать форму 1 для элемента данных.

let $act :=(
<act time="1231">
    <data value="2">hello</data>
    <data value="2">hello</data>
    <data value="2">hello</data>
    <data value="2">hello</data>
    <data value="2">hello</data>
    <data value="2">hello</data>
</act>,
<act time="51292">
    <state>
        <data value="2">world</data>
        <data value="2">world</data>
        <data value="2">world</data>
        <data value="2">world</data>
        <data value="2">world</data>
    </state>
</act>,
<act time="41212">
    <state1>
        <state2>
            <data value="2">3</data>
            <data value="2">3</data>
            <data value="2">3</data>
            <data value="2">3</data>
            <data value="2">3</data>
        </state2>
    </state1>
</act>
)

let $markAct:=<mainact>{for $data in $act
    return 
    $data
    }</mainact>
let $data:=  

for $in in $markAct//act

return <act time="{$in/@time}">{
    for $data in $in//data
    return <data value="{$data}">{count($data/preceding::data)+1}</data>
    }</act>


return $data
...