2011-02-03 50 views
0

我在尝试运行XQuery转换时遇到了XP0006错误(OSB的XQuery实现,如果这有所作为),我很难解决它。XP0006 XQuery转换错误

给出的错误是

<error>Error occurred while executing XQuery: {err}XP0006: "element {http://www.websitename.com/claims/client/UpdateClient.xsd}updateClient { {http://www.w3.org/2004/07/xpath-datatypes}untypedAny }": bad value for type element {http://www.websitename.com/claims/client/UpdateClient}updateClient { {http://www.w3.org/2001/XMLSchema}anyType }</error> 

至于我可以告诉这个错误的根源是,我的源XML文件包含多个命名空间。运行在只有一个名称空间的XML文件上的单独转换运行良好。

这是给我找麻烦转型:

(:: pragma bea:global-element-parameter parameter="$updateClient1" element="ns0:updateClient" location="../xsd/claims/client/UpdateClient.xsd" ::) 
(:: pragma bea:global-element-return element="ns3:TemplateUpdateClient-WrkFrm" location="../xsd/claims/templates/wc/UpdateClient.xsd" ::) 

declare namespace ns2 = "http://www.websitename.com/common/customDataTypes"; 
declare namespace ns1 = "http://www.websitename.com/document/production/common/customDataTypes"; 
declare namespace ns3 = "http://www.websitename.com/document/production/template/templateupdateclient"; 
declare namespace ns0 = "http://www.websitename.com/claims/client/UpdateClient"; 
declare namespace xf = "http://tempuri.org/DocumentSubmissionConversionOSB/XQuery/WCtest/"; 

(:~ 
: This function converts a set of strings describing 
: an address into the new address format 
: 
: @param $recipient the addressee 
: @param $line1 address Line#1 
: @param $line2 address Line#2 
: @param $lnie3 address Line#3 
: @param $city the city 
: @param $provinceOrState the province (if CA) or state (if US) 
: @param $country the country (CA, US, or something else) 
: @param $postalOrZIP the postal code (if CA or other) or zip code (if US) 
: @return either a <CanadanAddress>, a <USAddress>, or an <InternationalAddress> depending on the country 
:) 
declare function local:to-address(
    $recipient as xs:string, 
    $line1 as xs:string, 
    $line2 as xs:string, 
    $line3 as xs:string, 
    $city as xs:string, 
    $provinceOrState as xs:string, 
    $country as xs:string, 
    $postalOrZIP as xs:string 
) 
as element() { 
    if (fn:upper-case($country) = 'CA') then 
     <CanadianAddress> 
      <City>{ $city }</City> 
      <Country>{ $country }</Country> 
      <PostalCode>{ $postalOrZIP }</PostalCode> 
      <Province>{ $provinceOrState }</Province> 
      <Recipient>{ $recipient }</Recipient> 
      <StreetAddress>{ $line1 }</StreetAddress> 
      <StreetAddress>{ $line2 }</StreetAddress> 
      <StreetAddress>{ $line3 }</StreetAddress> 
      <StreetAddress/> 
     </CanadianAddress> 
    else 
     if (fn:upper-case($country) = 'US') then 
      <USAddress> 
       <City>{ $city }</City> 
       <Country>{ $country }</Country> 
       <ZipCode>{ $postalOrZIP }</ZipCode> 
       <State>{ $provinceOrState }</State> 
       <Recipient>{ $recipient }</Recipient> 
       <StreetAddress>{ $line1 }</StreetAddress> 
       <StreetAddress>{ $line2 }</StreetAddress> 
       <StreetAddress>{ $line3 }</StreetAddress> 
      </USAddress>   
     else   
      <InternationalAddress> 
       <City>{ $city }</City> 
       <Country>{ $country }</Country> 
       <PostalCode>{ $postalOrZIP }</PostalCode> 
       <Recipient>{ $recipient }</Recipient> 
       <StreetAddress>{ $line1 }</StreetAddress> 
       <StreetAddress>{ $line2 }</StreetAddress> 
       <StreetAddress>{ $line3 }</StreetAddress> 
      </InternationalAddress> 
     (:endif:) 
    (:endif:) 
}; 

declare function xf:WCtest($updateClient1 as element(ns0:updateClient)) 
    as element(ns3:TemplateUpdateClient-WrkFrm) { 
     <ns3:TemplateUpdateClient-WrkFrm> 
      { 
       let $Client := $updateClient1/ns0:Client 
       return 
        <Client> 
         <ClaimNumber>{ data($Client/ns0:claimNumber) }</ClaimNumber> 
         <Gender>{ data($Client/ns0:gender) }</Gender> 
         <MaritalStatus>{ data($Client/ns0:maritalStatus)}</MaritalStatus> 
         { 
          let $fullName := $Client/ns0:fullName 
          return 
           <Name> 
            <FirstName>{ data($fullName/ns0:firstName) }</FirstName> 
            <LastName>{ data($fullName/ns0:lastName) }</LastName> 
            <MiddleInitial>{ data($fullName/ns0:middleName) }</MiddleInitial> 
           </Name> 
         } 
         <SIN>{ data($Client/ns0:SIN) }</SIN> 
         { 
          let $currentAddress := $Client/ns0:currentAddress 
          return 
           <CurrentAddress>{ 
            local:to-address(
             data($currentAddress/ns2:line1), 
             data($currentAddress/ns2:line2), 
             data($currentAddress/ns2:line3), 
             data($currentAddress/ns2:city), 
             data($currentAddress/ns2:provinceOrState), 
             data($currentAddress/ns2:country), 
             data($currentAddress/ns2:postalOrZipCode) 
            ) 
           }</CurrentAddress> 
         } 
        </Client> 
      } 
     </ns3:TemplateUpdateClient-WrkFrm> 
}; 

declare variable $updateClient1 as element(ns0:updateClient) external; 

xf:WCtest($updateClient1) 

这里的数据,我想通过它来运行的一个样本:

<?xml version="1.0"?> 
<updateClient xmlns="http://www.websitename.com/claims/client/UpdateClient.xsd" xmlns:cus="http://www.websitename.com/common/customDataTypes.xsd"> 
    <Client> 
    <claimNumber>00000</claimNumber> 
    <SIN>000000000</SIN> 
    <fullName> 
     <firstName>First</firstName> 
     <middleName>Middle</middleName> 
     <lastName>Last</lastName> 
    </fullName> 
    <gender>male</gender> 
    <maritalStatus>married</maritalStatus> 
    <currentAddress> 
     <cus:line1>line1</cus:line1> 
     <cus:line2/> 
     <cus:line3/> 
     <cus:city>city</cus:city> 
     <cus:provinceOrState>province</cus:provinceOrState> 
     <cus:postalOrZipCode>H0H 0H0</cus:postalOrZipCode> 
     <cus:country>CA</cus:country> 
    </currentAddress> 
    </Client> 
</updateClient> 

这里是正在转型:

(:: pragma bea:global-element-parameter parameter="$workerAppeal1" element="ns0:workerAppeal" location="../../xsd/claims/worker/appeal/WorkerAppeal.xsd" ::) 
(:: pragma bea:global-element-return element="ns2:TemplateWorkerAppeal-WrkFrm" location="../../xsd/claims/templates/ais/WorkerAppeal.xsd" ::) 

declare namespace ns2 = "http://www.website.com/document/production/template/templateworkerappeal"; 
declare namespace ns1 = "http://www.website.com/document/production/common/customDataTypes"; 
declare namespace ns3 = "http://www.website.com/document/production/templatebase"; 
declare namespace ns0 = "http://www.website.com/claims/worker/appeal/WorkerAppeal.xsd"; 
declare namespace xf = "http://tempuri.org/DocumentSubmissionConversionOSB/XQuery/AIS/AIStest/"; 


(:~ 
: This function converts a set of strings describing 
: an address into the new address format 
: 
: @param $recipient the addressee 
: @param $line1 address Line#1 
: @param $line2 address Line#2 
: @param $lnie3 address Line#3 
: @param $city the city 
: @param $provinceOrState the province (if CA) or state (if US) 
: @param $country the country (CA, US, or something else) 
: @param $postalOrZIP the postal code (if CA or other) or zip code (if US) 
: @return either a <CanadanAddress>, a <USAddress>, or an <InternationalAddress> depending on the country 
:) 
declare function local:to-address(
    $recipient as xs:string, 
    $line1 as xs:string, 
    $line2 as xs:string, 
    $line3 as xs:string, 
    $city as xs:string, 
    $provinceOrState as xs:string, 
    $country as xs:string, 
    $postalOrZIP as xs:string 
) 
as element() { 
    if (fn:upper-case($country) = 'CA') then 
     <CanadianAddress> 
      <City>{ $city }</City> 
      <Country>{ $country }</Country> 
      <PostalCode>{ $postalOrZIP }</PostalCode> 
      <Province>{ $provinceOrState }</Province> 
      <Recipient>{ $recipient }</Recipient> 
      <StreetAddress>{ $line1 }</StreetAddress> 
      <StreetAddress>{ $line2 }</StreetAddress> 
      <StreetAddress>{ $line3 }</StreetAddress> 
      <StreetAddress/> 
     </CanadianAddress> 
    else 
     if (fn:upper-case($country) = 'US') then 
      <USAddress> 
       <City>{ $city }</City> 
       <Country>{ $country }</Country> 
       <ZipCode>{ $postalOrZIP }</ZipCode> 
       <State>{ $provinceOrState }</State> 
       <Recipient>{ $recipient }</Recipient> 
       <StreetAddress>{ $line1 }</StreetAddress> 
       <StreetAddress>{ $line2 }</StreetAddress> 
       <StreetAddress>{ $line3 }</StreetAddress> 
      </USAddress>   
     else   
      <InternationalAddress> 
       <City>{ $city }</City> 
       <Country>{ $country }</Country> 
       <PostalCode>{ $postalOrZIP }</PostalCode> 
       <Recipient>{ $recipient }</Recipient> 
       <StreetAddress>{ $line1 }</StreetAddress> 
       <StreetAddress>{ $line2 }</StreetAddress> 
       <StreetAddress>{ $line3 }</StreetAddress> 
      </InternationalAddress> 
     (:endif:) 
    (:endif:) 
}; 

declare function xf:AIStest($workerAppeal1 as element(ns0:workerAppeal)) 
    as element(ns2:TemplateWorkerAppeal-WrkFrm) { 
     <ns2:TemplateWorkerAppeal-WrkFrm> 
      <AppealDate>{ data($workerAppeal1/ns0:appealDate) }</AppealDate> 
      <DecisionAppealled>{ data($workerAppeal1/ns0:decisionAppealled) }</DecisionAppealled> 
      <DecisionWrong>{ data($workerAppeal1/ns0:decisionWrong) }</DecisionWrong> 
      <Expectations>{ data($workerAppeal1/ns0:expectations) }</Expectations> 
      { 
       let $Appellant := $workerAppeal1/ns0:Appellant 
       return 
        <Appellant> 
         { 
          let $claimantName := $Appellant/ns0:claimantName 
          return 
           <ClaimantName> 
            <FirstName>{ data($claimantName/ns0:firstName) }</FirstName> 
            <LastName>{ data($claimantName/ns0:lastName) }</LastName> 
           </ClaimantName> 
         } 
         <ClaimNumber>{ data($Appellant/ns0:claimNumber) }</ClaimNumber> 
         <AreYouTheClaimant>{ data($Appellant/ns0:areYouTheClaimant) }</AreYouTheClaimant> 
        </Appellant> 
      } 
      { 
       let $Representative := $workerAppeal1/ns0:Representative 
       return 
        <Representative> 
         { 
          let $phoneNumber := $Representative/ns0:phoneNumber 
          return 
           <Phone> 
            <AreaCode>{ data($phoneNumber/ns0:areaCode) }</AreaCode> 
            <Number>{ data($phoneNumber/ns0:numeric) }</Number> 
           </Phone> 
         } 
         <RelationshipToAppellant>{ data($Representative/ns0:relationshiptoAppellant) }</RelationshipToAppellant> 
         { 
          let $representativeAddress := $Representative/ns0:representativeAddress 
          return 
           <RepresentativeAddress>{ 
            local:to-address(
             concat(
              data($Representative/ns0:representativeName/ns0:firstName), 
              ' ', 
              data($Representative/ns0:representativeName/ns0:lastName) 
             ), 
             data($representativeAddress/ns0:addressLine1), 
             data($representativeAddress/ns0:addressLine2), 
             data($representativeAddress/ns0:addressLine3), 
             data($representativeAddress/ns0:city), 
             data($representativeAddress/ns0:province), 
             data($representativeAddress/ns0:country), 
             data($representativeAddress/ns0:postalCode) 
            ) 
           }</RepresentativeAddress> 
         } 
         { 
          let $representativeName := $Representative/ns0:representativeName 
          return 
           <RepresentativeName> 
            <FirstName>{ data($representativeName/ns0:firstName) }</FirstName> 
            <LastName>{ data($representativeName/ns0:lastName) }</LastName> 
           </RepresentativeName> 
         } 
         <EmailAddress>{ data($Representative/ns0:emailAddress) }</EmailAddress> 
        </Representative> 
      } 
     </ns2:TemplateWorkerAppeal-WrkFrm> 
}; 

declare variable $workerAppeal1 as element(ns0:workerAppeal) external; 

xf:AIStest($workerAppeal1) 

这里是样本数据是:

<?xml version="1.0"?> 
<workerAppeal xmlns="http://www.websitename.com/claims/worker/appeal/WorkerAppeal.xsd"> 
    <appealDate>2011-02-03-11:00</appealDate> 
    <Appellant> 
    <claimNumber>00000</claimNumber> 
    <claimantName> 
     <firstName>First</firstName> 
     <lastName>Last</lastName> 
    </claimantName> 
    <areYouTheClaimant>true</areYouTheClaimant> 
    </Appellant> 
    <Representative> 
    <representativeName> 
     <firstName/> 
     <lastName/> 
    </representativeName> 
    <relationshiptoAppellant/> 
    <representativeAddress> 
     <addressLine1/> 
     <addressLine2/> 
     <addressLine3/> 
     <city>city</city> 
     <province>province</province> 
     <postalCode>H0H 0H0</postalCode> 
     <country>CA</country> 
    </representativeAddress> 
    <phoneNumber> 
     <areaCode>111</areaCode> 
     <numeric>1111111</numeric> 
    </phoneNumber> 
    <emailAddress>[email protected]</emailAddress> 
    </Representative> 
    <decisionAppealled>decisionAppealled</decisionAppealled> 
    <decisionWrong>decisionWrong</decisionWrong> 
    <expectations>expectations</expectations> 
</workerAppeal> 

的转换文件主要是自动生成的,除了自定义地址函数映射器。 我可以看到两个转换之间唯一的主要差异是示例文件中的这些行 - 工作人员只有一个名称空间,而出现错误的人员有两个。

<workerAppeal xmlns="http://www.website.com/claims/worker/appeal/WorkerAppeal.xsd"><!--Working--> 
<updateClient xmlns="http://www.website.com/claims/client/UpdateClient.xsd" xmlns:cus="http://www.website.com/common/customDataTypes.xsd"><!--Gives error--> 

任何帮助将通过非常感激,因为XQuery是仍然是一个相当外国的东西给我,这是推动我坚果。 (是的,代码已经有点匿名 - 网址并不是真的www.website.com例如,希望这没有造成任何问题)

在此先感谢!

回答

0

从该声明:

declare namespace 
     ns0 = "http://www.websitename.com/claims/client/UpdateClient"; 

declare function xf:WCtest($updateClient1 as element(ns0:updateClient)) 

declare variable $updateClient1 as element(ns0:updateClient) external; 

这意味着xf:WCtest()功能和$updateClient1外部变量(参数)预计{http://www.websitename.com/claims/client/UpdateClient}updateClient元素,但输入信号源,具有{http://www.websitename.com/claims/client/UpdateClient.xsd}updateClient。但是,当然,我不知道你是什么传递作为参数...

http://www.w3.org/TR/2004/WD-xquery-20040723/#ERRXP0006

错误:XP0006
在评估阶段,这是一个type error如果 如由匹配规则 2.4.4 SequenceType Matching指定的值不匹配所要求的类型 。

+0

Whoohoo!我试图加入的.xsd命名空间声明的结尾,这似乎已经解决了这个问题。我从来没有想过要触摸那些,因为它们是为我生成的。万分感谢! – Jason 2011-02-03 21:12:57