Как вернуть данные из нескольких узлов XML с помощью Xquery с пространством имен?

Используя пространство имен Microsoft, как показано ниже, как return вывести, например:

<first>a</first>
<last>b</last>
<first>c</first>
<last>c</last>

Где я сталкиваюсь с синтаксической ошибкой с предложением возврата:

nicholas@mordor:~/flwor$ 
nicholas@mordor:~/flwor$ basex sample.xq 
Stopped at /home/nicholas/flwor/sample.xq, 17/37:
[XPST0003] Expecting ')', found '>'.
nicholas@mordor:~/flwor$ 
nicholas@mordor:~/flwor$ basex sample.full.xq 
<Objs xmlns="http://schemas.microsoft.com/powershell/2004/04" Version="1.1.0.1">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCustomObject</T>
      <T>System.Object</T>
    </TN>
    <MS>
      <S N="First Name">a</S>
      <S N="Last Name">b</S>
      <S N="Emails">a@b;[email protected]</S>
      <S N="Phones">123 456-8904</S>
      <S N="Company Name"/>
    </MS>
  </Obj>
  <Obj RefId="1">
    <TNRef RefId="0"/>
    <MS>
      <S N="First Name">c</S>
      <S N="Last Name">c</S>
      <S N="Emails">[email protected]</S>
      <S N="Phones">123456-3532;563 346-3453</S>
      <S N="Company Name"/>
    </MS>
  </Obj>
</Objs>nicholas@mordor:~/flwor$ 
nicholas@mordor:~/flwor$ 
nicholas@mordor:~/flwor$ cat sample.xq 

xquery version "3.1";


declare namespace ns1="http://schemas.microsoft.com/powershell/2004/04";


for $contact in db:open("sample")


let $first  := $contact//ns1:S[1][@N="First Name"]/data() 
let $last   := $contact//ns1:S[2][@N="Last Name"]/data() 
let $emails := $contact//ns1:S[3][@N="Emails"]/data() 
let $phones := $contact//ns1:S[4][@N="Phones"]/data() 


return (<first>{$first}</first><last>{$last}</last>)

nicholas@mordor:~/flwor$ 

Я пробовал несколько способов заключить предложение return в скобки или фигурные скобки, но примеры, которые я видел, не используют пространство имен, как здесь.

вывод примера не отличает один контакт от другого.


person Nicholas Saunders    schedule 10.12.2020    source источник


Ответы (1)


Попробуйте так

for $contact in db:open("sample")//*:MS
let $first := $contact//*:S[@N="First Name"]/text(),
  $last:= $contact//*:S[@N="Last Name"]/text()
return (<first>{$first}</first>,<last>{$last}</last>)

Вывод должен быть

<first>a</first>
<last>b</last>
<first>c</first>
<last>c</last>
person Jack Fleeting    schedule 10.12.2020