Xquery FORG0001: недопустимое значение для ошибки приведения/конструктора

Я использую сопоставление Xquery в своем проекте OSB. Ниже приведен пример кода, который я использую, который выдает ошибку

let $unitofmeasure := 
  if (data($ItemMaster/ns1:Item/ns1:dcunitofmeasure)= 1) then
    'CS'
  else if (data($ItemMaster/ns1:Item/ns1:dcunitofmeasure) = 2 or 
           data($ItemMaster/ns1:Item/ns1:dcunitofmeasure) = 3 ) then
    'EA'
  else if (data($ItemMaster/ns1:Item/ns1:corpwarehouseunitofmeasure) = 2 or 
           data($ItemMaster/ns1:Item/ns1:corpwarehouseunitofmeasure) = 3 ) then
    'EA'
  else 
    'CS'

Позже я использую определенную выше переменную для сопоставления с целевым узлом BaseStorageUOM(String)

{
  if ($unitofmeasure != '') then
    (
      <BaseStorageUOM>{xs:string($unitofmeasure)}</BaseStorageUOM>
    )
  else 
    (
      <BaseStorageUOM>CS</BaseStorageUOM>
    )
}

Когда я запускаю это, возникает ошибка при выполнении преобразования XQuery:

{http://www.w3.org/2005/xqt-errors}FORG0001 : "": недопустимое значение для приведения/конструктора: {http://www.w3.org/2001/XMLSchema}double: error: double: Недопустимое двойное значение:

Я не мог понять проблему с кодом.


person vikash    schedule 20.12.2017    source источник


Ответы (1)


Эта упрощенная версия отлично работает с Saxon, поэтому XQuery в порядке, если у вас есть return где-то, не упомянутый в вашем примере.

let $data :=  <root>
                <dcunitofmeasure>2</dcunitofmeasure>
              </root>

 let $unitofmeasure :=  if ($data//dcunitofmeasure = 1) 
                        then 'CS'
                          else if ($data//dcunitofmeasure = 2 or $data//dcunitofmeasure = 3) 
                          then 'EA'
                        else 'CS'

 return
   if ($unitofmeasure != '') 
   then ( <BaseStorageUOM>{xs:string($unitofmeasure)}</BaseStorageUOM> )
   else  ( <BaseStorageUOM>CS</BaseStorageUOM> )
person duncdrum    schedule 20.12.2017
comment
спасибо за ответ @duncdrum. Разобрался с проблемой, dcunitofmeasure - это десятичный тип данных, поэтому он не работает, когда я пытался сравнить его с 1 в условии if. - person vikash; 20.12.2017