2011-02-03 2 views
0

Я получаю ошибку XP0006 при попытке выполнить преобразование XQuery (реализация XQuery OSB, если это имеет значение), и мне трудно решить ее.Ошибка 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 все еще довольно внешняя вещь для меня, и это сводит меня с ума. (Да, код был немного анонимным - URL-адреса на самом деле не являются сайтом 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

ERR: XP0006
На этапе оценки, это type error если значение не соответствует требуемому типу , как указано в правилах соответствия в 2.4.4 SequenceType Matching.

+0

Whoohoo! Я попытался добавить .xsd в конец объявления пространства имен и, похоже, решил проблему. Я даже не думал прикоснуться к ним, так как они были созданы для меня. Благодаря тонну! – Jason

+0

@ Джейсон: Добро пожаловать! –

+0

[Nithi] (http://stackoverflow.com/users/4353240/nithi) сказал: «Я получаю ту же ошибку. JAson, не могли бы вы рассказать мне, где вы добавили имя xsd после пространства имен. Это во входном XML-файле, который вы отправляете?' –

Смежные вопросы