XQuery 用条件失败替换值

XQuery Replace Value With Conditional Failing

我正在 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,但当字段 revision 具有值时,结果始终不是 XXX。 (这总是转到 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>

有什么想法吗?

更新

根据下面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() 语句。 有什么想法吗?

之前谢谢你。

问题是,empty() 检查空序列,因此 empty() 认为包含一个空字符串的序列 true。您可以将 data() 结果传递给 if,因为 empty 的有效布尔值为 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 ()