Вернуть несколько узлов XML и пользовательский родительский тег с помощью FLWOR XQuery

Мне нужно получить следующий вывод, используя выражение FLWOR.

<oldPlanes>
  <make>Cessna</make>
  <model>Centurian</model>
  <make>Piper</make>
  <model>Tripacer</model>
</oldPlanes>

с использованием

CREATE TABLE XMLO1 (xDoc XML NOT NULL)

INSERT INTO XMLO1 VALUES ('
 <planes>
   <plane>
     <year>1977</year>
     <make>Cessna</make>
     <model>Skyhawk</model>
     <color>Light blue and white</color>
   </plane>
   <plane>
     <year>1975</year>
     <make>Piper</make>
     <model>Apache</model>
     <color>White</color>
   </plane>
   <plane>
     <year>1960</year>
     <make>Cessna</make>
     <model>Senturian</model>
     <color>Yellow and White</color>
   </plane>
   <plane>
     <year>1956</year>
     <make>Piper</make>
     <model>ripacer</model>
     <color>Blue</color>
   </plane>
 </planes>')

Я попробовал следующий запрос

SELECT xDoc.query('for $p in //plane
                    let $x:=$p/year
                    where $x < 1970
                    return <oldPlanes><make>{data($p/make)}</make> 
                           </oldPlanes>
                    ')
FROM XMLO1

Это не дает мне ожидаемого результата, чтобы найти плоскости, где Year < 1970.

Как установить собственный родительский узел как <oldPlanes>

Как вернуть 2 узла в качестве ожидаемого результата?


person Harsha W    schedule 28.06.2019    source источник


Ответы (1)


Вы хотите создать только один элемент oldPlanes, поэтому его конструкция должна быть вне выражения FLWOR:

<oldPlanes>{for $p in //plane
            let $x:=$p/year
            where $x < 1970
            return $p/(make, model)}</oldPlanes>

За исключением того, что для этого вам вообще не нужен FLWOR, простое выражение пути выполнит эту работу:

<oldPlanes>{//plane[year < 1970]/(make, model)}</oldPlanes>
person Michael Kay    schedule 28.06.2019
comment
Спасибо @Майкл. Я смог получить требуемый результат, как показано ниже. SELECT xDoc.query('let $planes := planes/plane return <oldPlanes>{ for $x in $planes where $x/year < 1970 return ($x/make,$x/model) }</oldPlanes>') FROM XMLO1 - person Harsha W; 28.06.2019
comment
Не могли бы вы помочь мне и с этим stackoverflow.com/ вопросы/56803940/ - person Harsha W; 28.06.2019