Завершено Xquery для нескольких циклов - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть запрос на ввод, как показано ниже

<Input>
<BusinessObjects>
      <BusinessObject>
        <BusinessIdentifiers>
          <BusinessIdentifier>
            <BKey>BuCode</BKey>
            <BValue>CDC</BValue>
          </BusinessIdentifier>
          <BusinessIdentifier>
            <BKey>BuType</BKey>
            <BValue>123</BValue>
          </BusinessIdentifier>
          <BusinessIdentifier>
            <BKey>CsmNo</BKey>
            <BValue>857895</BValue>
          </BusinessIdentifier>
        </BusinessIdentifiers>
       </BusinessObject>
      <BusinessObject>
        <BusinessIdentifiers>
          <BusinessIdentifier>
            <BKey>BuCode</BKey>
            <BValue>CDC</BValue>
          </BusinessIdentifier>
          <BusinessIdentifier>
            <BKey>BuType</BKey>
            <BValue>123</BValue>
          </BusinessIdentifier>
          <BusinessIdentifier>
            <BKey>CsmNo</BKey>
            <BValue>34567</BValue>
          </BusinessIdentifier>
        </BusinessIdentifiers>
        </BusinessObject>      
    </BusinessObjects>
    </Input>

Мне нужно сформировать вывод, как показано на схеме ниже

<Output>
<BusinessObject>
<BIKey></BIKey>
<BKey></BIKey>
<Bvalue></Bvalue>
<BOID></BOID>
</BusinessObject>
</Output>

Для вышеуказанной полезной нагрузки Выход должен быть

<Output>
<BusinessObjects>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUCode</BKey>
<Bvalue>CDC</Bvalue>
<BOID>CDC:123:857895</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUtype</BKey>
<Bvalue>123</Bvalue>
<BOID>CDC:123:857895</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>CSMNo</BKey>
<Bvalue>857895</Bvalue>
<BOID>CDC:123:857895</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUCode</BKey>
<Bvalue>CDC</Bvalue>
<BOID>CDC:123:34567</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUtype</BKey>
<Bvalue>123</Bvalue>
<BOID>CDC:123:34567</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>CSMNo</BKey>
<Bvalue>857895</Bvalue>
<BOID>CDC:123:34567</BOID>
</BusinessObject>
</BusinessObjects>
</Output>

Я попробовал ниже Xquery, чтобы получить то же самое, но в итоге с ошибками или не соответствовал requiremnt

<Ouput>
<BusinessObjects>
{
for $bi in Input/BusinessObjects/BusinessObject/BusinessIdentifiers/BusinessIdentifier
return
<BIKey>
    {
        string-join(
            for $bo in Input/BusinessObjects/BusinessObject return string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, '|'),
            ':'
        )
    }
    </BIKey>
    <BKey>data {$bi/Bkey}</BKey>
    <Bvalue>data {$bi/Bvalue}</Bvalue>
    for $bo in Input/BusinessObjects/BusinessObject return <BOID>{string-join($bo//BValue, ':')}<BOID>

}
</BusinessObjects>
</Ouput>

описание полей вывода следующим образом BIKey -> он сформирован со всемиЗначения «бизнес-идентификатора» объединяются с «:», а затем для каждого бизнес-объекта отделяется с «|»Bkey -> Прямое сопоставление с bkey Bvalue -> Прямое сопоставление с Bvalue BOID -> оно должно формироваться для каждого бизнес-объекта, необходимо объединить значения Bvalue of Business Identifiers с ':' Любые предложения, я считаю, что мне нужнодве сложные петли здесь, но не в состоянии взломать его.

Спасибо

1 Ответ

0 голосов
/ 22 ноября 2018

С запросом

<Output>
    <BusinessObjects>
        {
            //BusinessIdentifier 
            ! 
            <BusinessObject>
                <BIKey>{string-join(ancestor::BusinessObjects/BusinessObject!string-join(.//BValue, ':'), '|')}</BIKey>
                {
                    BKey, 
                    BValue
                }
                <BOID>{ancestor::BusinessObject!string-join(.//BValue, ':')}</BOID>
            </BusinessObject>
        }
    </BusinessObjects>
</Output>

на https://xqueryfiddle.liberty -development.net / 948Fn5g я получаю результат

<Output>
   <BusinessObjects>
      <BusinessObject>
         <BIKey>CDC:123:857895|CDC:123:34567</BIKey>
         <BKey>BuCode</BKey>
         <BValue>CDC</BValue>
         <BOID>CDC:123:857895</BOID>
      </BusinessObject>
      <BusinessObject>
         <BIKey>CDC:123:857895|CDC:123:34567</BIKey>
         <BKey>BuType</BKey>
         <BValue>123</BValue>
         <BOID>CDC:123:857895</BOID>
      </BusinessObject>
      <BusinessObject>
         <BIKey>CDC:123:857895|CDC:123:34567</BIKey>
         <BKey>CsmNo</BKey>
         <BValue>857895</BValue>
         <BOID>CDC:123:857895</BOID>
      </BusinessObject>
      <BusinessObject>
         <BIKey>CDC:123:857895|CDC:123:34567</BIKey>
         <BKey>BuCode</BKey>
         <BValue>CDC</BValue>
         <BOID>CDC:123:34567</BOID>
      </BusinessObject>
      <BusinessObject>
         <BIKey>CDC:123:857895|CDC:123:34567</BIKey>
         <BKey>BuType</BKey>
         <BValue>123</BValue>
         <BOID>CDC:123:34567</BOID>
      </BusinessObject>
      <BusinessObject>
         <BIKey>CDC:123:857895|CDC:123:34567</BIKey>
         <BKey>CsmNo</BKey>
         <BValue>34567</BValue>
         <BOID>CDC:123:34567</BOID>
      </BusinessObject>
   </BusinessObjects>
</Output>

В XQuery 1 вы не 't * имеет простой оператор карты !, но вы должны использовать вместо него for .. return, см. https://xqueryfiddle.liberty -development.net / 948Fn5g / 1 с

<Output>
    <BusinessObjects>
        {
            for $bi in //BusinessIdentifier 
            return  
            <BusinessObject>
                <BIKey>{string-join($bi/ancestor::BusinessObjects/BusinessObject/string-join(.//BValue, ':'), '|')}</BIKey>
                {
                    $bi/BKey, 
                    $bi/BValue
                }
                <BOID>{$bi/ancestor::BusinessObject/string-join(.//BValue, ':')}</BOID>
            </BusinessObject>
        }
    </BusinessObjects>
</Output>

илипростые шаги по созданию нового элемента, см. https://xqueryfiddle.liberty -development.net / 948Fn5g / 2 с

<Output>
    <BusinessObjects>
        {
            //BusinessIdentifier/
            <BusinessObject>
                <BIKey>{string-join(ancestor::BusinessObjects/BusinessObject/string-join(.//BValue, ':'), '|')}</BIKey>
                {
                    BKey, 
                    BValue
                }
                <BOID>{ancestor::BusinessObject/string-join(.//BValue, ':')}</BOID>
            </BusinessObject>
        }
    </BusinessObjects>
</Output>
...