Ошибка XP0006 в преобразовании XQuery - PullRequest
0 голосов
/ 03 февраля 2011

Я получаю ошибку XP0006 при попытке запустить преобразование XQuery (реализация XQuery в OSB, если это имеет какое-то значение), и мне трудно ее разрешить.

Ошибка:

 <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@email.com</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. Надеюсь, это не вызвало проблем)

Заранее спасибо!

1 Ответ

0 голосов
/ 03 февраля 2011

Из этого объявления:

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
На этапе оценки это ошибка типа , если значение не соответствует требуемому типу, как указано в правилах соответствия в 2.4.4 Соответствие SequenceType .

...