【问题标题】:Xquery --- FORG0001: "": invalid value for cast/constructor errorXquery --- FORG0001:“”:强制转换/构造函数错误的值无效
【发布时间】:2017-12-20 16:00:02
【问题描述】:

我在我的 OSB 项目中使用 Xquery 映射。下面是我正在使用的示例代码,它会抛出错误

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:错误:double:无效的 double 值:

我无法弄清楚代码的问题。

【问题讨论】:

    标签: xslt xquery osb oracle-service-bus oracle-soa


    【解决方案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> )
    

    【讨论】:

    • 感谢@duncdrum 的回复。找出问题所在,dcunitofmeasure 是十进制数据类型,因此当我尝试将其与 if 条件下的 1 进行比较时它失败了。
    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多