xslt / xquery для проверки значений двух атрибутов в условиях if - PullRequest
0 голосов
/ 06 марта 2019

Я застрял в одном месте в моем xquery.В ответ я хочу вернуть телефонные номера для каждого типа, то есть HOME и CELL, но только те, которые имеют самый высокий порядковый номер. Если есть две строки с PhoneType = "HOME", я хочу вернуть телефон с самой высокой последовательностьюиз двух, т.е. в моем случае Sequence = "3".

С моим xquery я могу вернуть phoneType = "HOME" и первый ряд с типом HOME.я не могу добавить условие для проверки последовательности.Где и как я могу добавить это.Пожалуйста, предложите.Заранее спасибо

Часть моего Xquery:

 <acc:phones>
                 {
                for $PersonPhonesRow in $PersonMaintenanceResponse/ns2:CMPersonService/ns2:CMPersonDetails/ns2:PersonPhones/ns2:PersonPhonesRow[@PhoneType="HOME"][1]
                    return
                    if(fn:data($PersonMaintenanceResponse/ns2:CMPersonService/ns2:CMPersonDetails/ns2:PersonPhones/ns2:PersonPhonesRow/@PhoneType="HOME"[1]))
                    then
                    <com:phone>
                            <com:type>{'HOME'}</com:type>
                            <com:phoneNumber>{fn:data($PersonMaintenanceResponse/ns2:CMPersonService/ns2:CMPersonDetails/ns2:PersonPhones/ns2:PersonPhonesRow[@PhoneType="HOME"][1]/@PhoneNumber)}</com:phoneNumber>
                            <com:carrier>{fn:data($PersonMaintenanceResponse/ns2:CMPersonService/ns2:CMPersonDetails/ns2:PersonPhones/ns2:PersonPhonesRow[@PhoneType="HOME"][1]/@Extension)}</com:carrier>
                    </com:phone>
                    else
                   ()
                  }
                </acc:phones>

Запрос:

<CMPerson xmlns="http://splwg.com/CMPerson.xsd">
     <CMPersonService>    
        <CMPersonDetails>
           <PersonPhones>
              <PersonPhonesHeader PersonID="1234567890" LastSequenceNumber="9"/>
              <PersonPhonesRow PersonID="1234567890" Sequence="1" PhoneType="HOME" IntlPrefix="" PhoneNumber="(850) 123-0000" Extension="" Version="12" PhoneAlgorithmParamValue="(999) 999-9999"/>
              <PersonPhonesRow PersonID="1234567890" Sequence="2" PhoneType="CELL" IntlPrefix="" PhoneNumber="(850) 000-0000" Extension="" Version="3" PhoneAlgorithmParamValue="(999) 999-9999"/>
              <PersonPhonesRow PersonID="1234567890" Sequence="3" PhoneType="HOME" IntlPrefix="" PhoneNumber="(850) 123-1111" Extension="ATT" Version="1" PhoneAlgorithmParamValue="(999) 999-9999"/>
              <PersonPhonesRow PersonID="1234567890" Sequence="4" PhoneType="BUSN" IntlPrefix="" PhoneNumber="(904) 111-1111" Extension="" Version="3" PhoneAlgorithmParamValue="(999) 999-9999"/>              
           </PersonPhones>
        </CMPersonDetails>
     </CMPersonService>
  </CMPerson>

Требуется ответ:

<acc:phones>
      <com:phone xmlns:com="******">
        <com:type>HOME</com:type>
        <com:phoneNumber>(850) 123-1111</com:phoneNumber>
        <com:carrier>ATT</com:carrier>
      </com:phone>
       <com:phone xmlns:com="******">
        <com:type>CELL</com:type>
        <com:phoneNumber>(904) 111-1111</com:phoneNumber>
        <com:carrier></com:carrier>
      </com:phone>
    </acc:phones>

1 Ответ

0 голосов
/ 06 марта 2019

Запрос для использования:

        let $PersonMaintenanceResponse := 'Your request'
        let $uniqPhoneType    :=distinct-values($PersonMaintenanceResponse/ns2:CMPersonService/ns2:CMPersonDetails/ns2:PersonPhones/ns2:PersonPhonesRow/@PhoneType)
        for $each at $i in $uniqPhoneType
        return 
        <acc:phones>
        {
        let $seq    := $PersonMaintenanceResponse/ns2:CMPersonService/ns2:CMPersonDetails/ns2:PersonPhones/ns2:PersonPhonesRow[(@PhoneType = $each)]
        let $maxValue := max($seq/@Sequence)
        let $maxrow := $seq[@Sequence eq $maxValue]
        return 
        <com:phone xmlns:com="*******">
        <com:type>{$each}</com:type>
        <com:phoneNumber>{$maxrow/@PhoneNumber}</com:phoneNumber>
        <com:carrier>{$maxrow/@Extension}</com:carrier>
        </com:phone>
        }</acc:phones>      
...