xquery для цикла и если условие и должно возвращать только первое значение - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь написать xquery, который имеет внутри цикла for.Ниже мой запрос

<PersonIdentifiers> 
<PIR  PersonID="1834040001" IDType="N/A" IDNumber="NA" PrimaryID="true" Version="2" IdentiferFormat=""/> 
<PIR  PersonID="111111111" IDType="WEB" IDNumber="abc" PrimaryID="false" Version="3" IdentiferFormat=""/> 
<PIR  PersonID="222222222" IDType="N/A" IDNumber="xyz" PrimaryID="false" Version="4" IdentiferFormat=""/> 
<PIR  PersonID="333333333" IDType="WEB" IDNumber="aaaaaa" PrimaryID="false" Version="5" IdentiferFormat=""/> 
 <PIR  PersonID="444444444" IDType="WEB" IDNumber="aaaaaa" PrimaryID="false" Version="6" IdentiferFormat=""/> 
</PersonIdentifiers> 

То, что я хочу в ответе, это просто 1 или первый «IDNumber» строки, где IDType = WEB. В настоящее время я использую ниже xquery, который имеет цикл for для прохождения массива.и верните мне значение, если IDType = WEB.Но я не могу остановиться после первого успешного значения.Как мне этого добиться?

Мой текущий xquery:

        <ns2:account>

        <acc:persons>
            <acc:person>
                <acc:personID>{fn:data($PersonMaintenanceResponse/ns1:PersonIdentifiers/ns1:PIR/@IDType)}</acc:personID>
                {
                for $PIR at $position in $PersonMaintenanceResponse//ns1:PersonIdentifiers/ns1:PIR
                return
                if($PersonMaintenanceResponse//ns1:PersonIdentifiers/ns1:PIR[$position]/@IDType='WEB')
                then
                    if ($PersonMaintenanceResponse/ns1:PersonIdentifiers/ns1:PIR[$position]/@IDNumber)
                    then <acc:ID>{fn:data($PersonMaintenanceResponse/ns1:PersonIdentifiers/ns1:PIR[$position]/@IDNumber)}</acc:ID>
                    else ()
                else
                ()
                }

            </acc:person>
        </acc:persons>
    </ns2:account>

Ответ от моего xquery

  <ns2:account>
<acc:persons xmlns:acc="***************">
  <acc:person>

    <acc:ID>abc</acc:ID>
    <acc:ID>aaaaaa</acc:ID>
    <acc:ID>aaaaaa</acc:ID>

  </acc:person>
</acc:persons>

Ожидаемый ответ - простополучить первый идентификатор, нам не нужны другие идентификаторы, как я могу остановиться после получения 1-го идентификатора

  <ns2:account>
<acc:persons xmlns:acc="***************">
  <acc:person>
     <acc:ID>abc</acc:ID>
  </acc:person>
</acc:persons>

1 Ответ

0 голосов
/ 01 декабря 2018

Использование предикатов в качестве фильтров и индексная позиция для получения первых

for $n in PersonIdentifiers/PIR[@IDType ="WEB"][1]
return
   data($n/@IDNumber)

Возвращает abc

см .: http://xqueryfiddle.liberty -development.net / nbUY4kr / 1

или как XPATH 1-лайнер

<account>
  <persons>
    <person>
        <ID>{data(PersonIdentifiers/PIR[@IDType ="WEB"][1]/@IDNumber)}</ID>
    </person>
  </persons>
</account>  
...