2016-06-02 3 views
0

Я нахожусь в середине создания xquery replace-value действия узла в XQuery.XQuery Заменить значение с условным сбоем

Но кажется, что этот код не работает, поэтому заявление IF-ELSE всегда будет другим.

Это мой код:

declare function local:replacing($contextData as element()) 
as element()* 
{  
    copy $pipeline := $contextData/Handler/Data/* 

    modify(

    if(not(empty(data($pipeline/Payload/sample/transactionType)))) then 
    replace value of node $pipeline/Payload/sample/transactionType with 'XXX' else(), 
    if(not(empty(data($pipeline/Payload/sample/revision)))) then 
    replace value of node $pipeline/Payload/sample/revision with 'XXX' else() 

    ) 
return $pipeline 
}; 

Стараюсь против этого образца XML, но результат всегда не XXX, когда поле revision является имеющим значение. (Это всегда идет на else заявление)

let $result := 
<root> 
<Handler> 
    <Data> 
    <root> 

     <Payload> 
      <sample> 
      <transactionType></transactionType> 
      <revision>123</revision> 
      <board>1</board> 
      <mission>1</mission> 
      <method>Manual</method> 
      <listOfBoard> 
       <board> 
       <type>small</type> 
       <amount>5054</amount> 
       <token>300</token> 
       </board> 
      </listOfBoard> 
      <pricing>300</pricing> 
      <playing>Wed</playing> 
      </sample> 
    </Payload> 

    </root> 

    </Data> 
</Handler> 
</root> 

Текущий результат:

<root> 
    <Payload> 
    <sample> 
     <transactionType/> 
     <revision>123</revision> 
     <board>1</board> 
     <mission>1</mission> 
     <method>Manual</method> 
     <listOfBoard> 
     <board> 
      <type>small</type> 
      <amount>5054</amount> 
      <token>300</token> 
     </board> 
     </listOfBoard> 
     <pricing>300</pricing> 
     <playing>Wed</playing> 
    </sample> 
    </Payload> 
</root> 

Ожидаемый результат

<root> 
     <Payload> 
     <sample> 
      <transactionType/> 
      <revision>XXX</revision> 
      <board>1</board> 
      <mission>1</mission> 
      <method>Manual</method> 
      <listOfBoard> 
      <board> 
       <type>small</type> 
       <amount>5054</amount> 
       <token>300</token> 
      </board> 
      </listOfBoard> 
      <pricing>300</pricing> 
      <playing>Wed</playing> 
     </sample> 
     </Payload> 
    </root> 

Любые идеи для этого?

Update

В соответствии с рекомендациями Har ниже, я изменить код в:

if(not(empty(data($pipeline/Payload/sample/transactionType)))) then 
      replace value of node $pipeline/Payload/sample/transactionType with 'XXX' 
     else (
      if(not(empty(data($pipeline/Payload/sample/revision)))) then 
      replace value of node $pipeline/Payload/sample/revision with 'XXX' else() 
     ) 

Но, кажется, результат тот же. Он по-прежнему относится к else(). Любые идеи?

Благодарим вас раньше.

ответ

1

Проблема была, empty() проверяет пустую последовательность, поэтому последовательность, содержащая одну пустую строку, считается true от empty(). Вы можете просто передать data() результат if так пусто имеет эффективное булево значение false:

if(data($pipeline/Payload/sample/transactionType)) then 
    replace value of node $pipeline/Payload/sample/transactionType with 'XXX' else(), 
if(data($pipeline/Payload/sample/revision)) then 
    replace value of node $pipeline/Payload/sample/revision with 'XXX' else() 
+0

спасибо за ваше обновление. Но похоже, что эта логика IF-Else все еще дает мне тот же результат. Остается только возврат. Я внес изменения в первую «замену значения узла», удалив else(), поскольку он дает мне ошибку в baseX. Любые идеи? Я уточню вопрос. – randytan

+0

Можете ли вы опубликовать образец XML, который должен перейти в блок 'if'? Ваш текущий XML правильно перейдет в 'else', так как он имеет пустой' transactionType', а 'if' оценивается как' true', когда 'transactionType' не пуст, не так ли? – har07

+0

Привет, спасибо за ваши комментарии. Кажется, логика, которую мне нужно обновить, не одна за другой. Он должен быть параллельным. Таким образом, в моем ожидаемом результате это: 'если значение равно none ', а затем показать как' none'. Else 'если есть значение' просто показать '' XXX''. Возможно ли одновременно обновлять два поля? – randytan

Смежные вопросы