XQuery заменяет значение условным отказом

Я занимаюсь созданием заменяющего значения 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>

Есть идеи для этого?

Обновить

Как рекомендовано Харом ниже, я меняю код на:

 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 (). Любые идеи?

Спасибо раньше.


person randytan    schedule 02.06.2016    source источник


Ответы (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 ()
person har07    schedule 02.06.2016
comment
спасибо за ваше обновление. Но похоже, что эта логика IF-Else все еще дает мне тот же результат. Только остальной блок возвращается. Я внес изменения в первый replace value of node, удалив else (), поскольку он выдает ошибку в baseX. Любые идеи? Я обновлю вопрос. - person randytan; 02.06.2016
comment
Можете ли вы опубликовать образец XML, который должен перейти в if блок? Ваш текущий XML правильно переходит к else, поскольку он имеет пустой transactionType, а if оценивается как true, когда transactionType не пуст, верно? - person har07; 02.06.2016
comment
Привет, спасибо за комментарии. Кажется, логика, которую мне нужно обновить, не одна за другой. Он должен быть параллельным. Итак, в моем ожидаемом результате это: if the value is none, затем отображается как none. Иначе if there is a value просто покажите 'XXX'. Можно ли одновременно обновить два поля? - person randytan; 02.06.2016
comment
Понятно, я совершенно неправильно понял проблему. В этом случае ваш исходный XQuery ближе к решению, чем мой. Проблема заключалась в том, что empty() проверяет наличие пустой последовательности, поэтому последовательность, содержащая одну пустую строку, рассматривается true empty() - person har07; 02.06.2016
comment
вау, спасибо за вашу щедрую помощь. Я уже пробую ваше решение. Но, похоже, результат все тот же, Хар. <revision> по-прежнему переходит к оператору else(), кроме того, если я помещаю значение внутрь <transactionType>, он также выполняет часть else(). Кажется, этот xquery не может его изменить. Кстати, я использую baseX 8.3. - person randytan; 02.06.2016