从xquery 2004迁移到xquery 1.0版本时出现此错误

问题描述 投票:0回答:1

//无效的Xquery内容:第89行,第44列:{http://www.w3.org/2005/xqt-errors} XPST0003 [{http://xmlns.oracle.com/xdk/xquery/error} XPST0003c]:语法错误。 “/ ns1:produ”是出乎意料的

迁移到1.0 V后的Xquery

xquery version "1.0";
(: Caring Included Logic Reset/@actioncode :)
(: Caring Fix#358 :)
(: Included CR for Project Caring :)
(: Added a xf:escape-dot function as a part of Jan - Break Fix :)
(: Included changes for Project Caring :)
(: Included mapping for accountGroups - CUG Migration :)
(: Included changes for Project AggregatedAlerts :)
(:: pragma bea:global-element-parameter parameter="$manageServiceOrder" element="ns3:manageServiceOrder" location="../../schemas/pf.bil.BillingProvisioning_3.0.xsd" ::)
(:: pragma bea:global-element-return element="ns0:CreateOrderCustomerRequest" location="../../../../resources_3.0/util/BRMAdapter/interfaces/InfranetUtilityCreate.xsd" ::)

declare namespace ns2 = "http://vodafone.com.au/ebo/vha/ProvisioningAndFulfilmentComponents/V3.0";
declare namespace ns1 = "http://vodafone.com.au/ebo/vha/CommonComponents/V3.0";
declare namespace ns3 = "http://vodafone.com.au/pf/bil/ebm/BillingProvisioning/V3.0";
declare namespace ns0 = "http://www.vodafone.co.au/infranetUtilityCreate/schema";
declare namespace xf = "http://tempuri.org/pf.bil_3.0/resources/billingProvisioning/BRM/EBO.SyncSubscription.billingProvisioning_xForm_BRM.createOrder/";
declare namespace temp = "http://www.w3.org/2001/XMLSchema";

declare xqse function xf:formatDateTimes($dateTime as element(*)*) as xs:dateTime?
{
    declare  $dateTimeValue :=data($dateTime);
   try
    {
        return value (xs:dateTime(replace(fn-bea:dateTime-to-string-with-format("yyyyMMddHHmmss",$dateTimeValue),"^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$","$1-$2-$3T$4:$5:$6")));
    }   
    catch (* into $err, $msg)
    { 
        return value (xs:dateTime(replace(fn-bea:date-to-string-with-format("yyyyMMdd",$dateTimeValue),"^(\d{4})(\d{2})(\d{2})$","$1-$2-$3T00:00:00")));
};  
};

declare xqse function xf:isValidChargeShareAtribute( $chargeShareLines as element(*)) as xs:boolean?
{
   try
    {
        iterate $attribute over $chargeShareLines/ns1:productService/ns1:attributes/ns1:attribute[fn:upper-case(ns1:name/text()) eq "CSG REFERENCE" or fn:upper-case(ns1:name/text()) eq "CSG SPONSORSHIP"]
        {
                if ( 
                        (   ($attribute/ns1:value ne "" and $chargeShareLines/@actionCode eq "New") 
                                or
                                 $chargeShareLines/@actionCode eq "Modified"
                                or
                            ($attribute/ns1:value ne "" and $chargeShareLines/@actionCode eq "Deleted") 
                        )

                    ) then return value (fn:boolean("true")) else return value( (fn:boolean("false")));
        };
    }   
    catch (* into $err, $msg)
    { return value (fn:boolean("false"));
};  
};

    declare function xf:lookupDVMWrapper($dvmName as xs:string, $sourceColumn as xs:string,$sourceValue as xs:string, $targetColumn as xs:string, $needAnException as xs:boolean)as element(*) 
 {
    let $dvmres :=(fn-bea:lookupDVM($dvmName,$sourceColumn,$sourceValue,$targetColumn,'NO DATA FOUND')) 
    return 
    if ((($dvmres='') or ($dvmres='NO DATA FOUND')) and $needAnException) 
    then 
    <dvmresp>
        <dvmexception>
    {
    concat($sourceValue,' for ',$sourceColumn,' in ',$dvmName,'.dvm', ' not found' )
    }
        </dvmexception>
    </dvmresp>
     else if((($dvmres='') or ($dvmres='NO DATA FOUND')) and not($needAnException)) 
      then 
      <dvmresp></dvmresp> 
      else 
      <dvmresp>
      {
      $dvmres
      }
      </dvmresp>
};  

declare  function xf:formatDate( $dateTime as element(*)*) as  xs:dateTime?
{
    let  $dateTimeValue :=data($dateTime)
        return xs:dateTime(replace(fn-bea:date-to-string-with-format("yyyyMMdd",$dateTimeValue),"^(\d{4})(\d{2})(\d{2})$","$1-$2-$3T00:00:00"))

};

declare  function xf:calculateVFPeriodEndDate($manageServiceOrder as element (*),$serviceLines as element(*))
    as xs:dateTime? {

  if ($serviceLines/@actionCode eq "Deleted" or $serviceLines/@actionCode eq "Suspended")
        then  xf:formatDateTimes(element{"billEffectiveDate"}{ $manageServiceOrder/ns3:serviceOrder/ns2:billingDetails/ns2:billEffectiveDate/text()})
    else if (fn:string-length(data($serviceLines/ns1:productService/ns1:periodEndDate)) >0 and data($serviceLines/ns1:productService/ns1:periodEndDate) ne "")
        then   xf:formatDate( element { "periodEndDate" } {if(fn:contains(data($serviceLines/ns1:productService/ns1:periodEndDate),"T"))then
        fn:substring-before(data($serviceLines/ns1:productService/ns1:periodEndDate),"T")
        else
        $serviceLines/ns1:productService/ns1:periodEndDate/text()})
    else if (
            for $expiryDate in $serviceLines/ns1:productService/ns1:attributes/ns1:attribute[ns1:name/text() eq "Expiry Date"]/ns1:value/text()
             return  
                if (fn:string-length($expiryDate) >0) then  xf:formatDateTimes( element { "expiryDate" } {$expiryDate}) else() )
        then 
            (
                for $expiryDate in $serviceLines/ns1:productService/ns1:attributes/ns1:attribute[fn:upper-case(ns1:name/text()) eq "EXPIRY DATE"]/ns1:value/text()
                 return  xf:formatDateTimes( element { "expiryDate" } {$expiryDate})
            )
    else () 
};
xquery upgrade
1个回答
0
投票

这里有几件事在XQuery 1.0中是不允许的。突出的是:

declare  $dateTimeValue :=data($dateTime);

你不能像那样声明局部变量。你需要let $v := expr return XXX

return value (xs:dateTime(...);

关键字return value错误,应删除。

iterate $attribute over $chargeShareLines

我不知道iterate表达式的作用,但它不是XQuery。看起来像for表达式的一些变体,但我不知道它是如何不同的。

try {

需要XQuery 3.0 / 3.1,语法与你的略有不同。

© www.soinside.com 2019 - 2024. All rights reserved.