2016-06-02 8 views
0

Ich bin gerade mitten in der Erstellung von xquery replace-value der Knotenaktion in XQuery.XQuery-Wert mit bedingtem Fehler ersetzen

Aber scheint dieser Code nicht funktioniert daher die IF-ELSE Anweisung geht immer zu sonst.

Dies ist mein Code:

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 
}; 

Ich versuche, gegen diese XML-Beispiel, aber das Ergebnis ist immer nicht XXX wenn das Feld revision Wert. (Dies geht immer an else Aussage)

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> 

Aktuell Ergebnis:

<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> 

Erwartetes Ergebnis

<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> 

Irgendwelche Ideen für diese?

aktualisieren

Wie unten von Har empfohlen, ändere ich den Code in:

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() 
     ) 

aber scheint das Ergebnis ist das gleiche. Es geht immer noch zu else() Anweisung. Irgendwelche Ideen?

Vielen Dank vorher.

Antwort

1

Das Problem war, empty() prüft auf leere Sequenz, so wird true von empty() Sequenz betrachtet, die eine leere Zeichenfolge enthält. Sie können nur data() Ergebnis if da leer übergeben hat effektiver Boolesche Wert von 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

Dank für Ihre Update. Aber scheint, dass diese IF-Else-Logik mir immer noch das gleiche Ergebnis bringt. Nur else Block ist zurück. Ich habe Änderungen am ersten 'Ersetze Wert von Knoten 'vorgenommen, indem ich else() entfernt habe, da es mir einen Fehler in der BaseX gibt. Irgendwelche Ideen? Ich werde die Frage aktualisieren. – randytan

+0

Können Sie Beispiel-XML-Dateien hochladen, die zu "if" -Block gehen sollen? Ihr aktuelles XML geht mit Recht auf "else", da es einen leeren "transactionType" hat, während das "if" zu "true" führt, wenn "transactionType" nicht leer ist, oder? – har07

+0

Hallo har, danke für deine Kommentare. Scheint, dass die Logik, die ich aktualisieren muss, nicht eins nach dem anderen ist. Es sollte parallel sein. Also in meinem erwarteten Ergebnis ist es: "Wenn der Wert keine ist", dann zeige als "none". Sonst 'wenn es einen Wert gibt' zeige einfach' 'XXX''. Ist es möglich, zwei Felder gleichzeitig zu aktualisieren? – randytan