0

私はこのxqueryをマップするためにツールを使用しましたが、自分がツールのスレーブにならないように、ツールが舞台裏で何をしたかを理解する必要があります

(:: pragma bea:global-element-parameter parameter="$retrieveCustomerByCriteriaResponse1" element="ns0:RetrieveCustomerByCriteriaResponse" location="../wsdl/CustomerService.wsdl" ::)
(:: pragma bea:global-element-return element="ns3:FindCustomerResponse" location="../wsdl/CustomerManagement.wsdl" ::)

declare namespace ns2 = "http://www.somecorp.com/customer";
declare namespace ns1 = "http://www.somecorp.com/creditcard";
declare namespace ns3 = "http://www.somecorp.org/CustomerManagement";
declare namespace ns0 = "http://www.crm.org/CustomerService/";
declare namespace xf = "http://tempuri.org/basic-osb-service/transformation/TransformFindCustomerResponse/";

declare function xf:TransformFindCustomerResponse(**$retrieveCustomerByCriteriaResponse1 as element(ns0:RetrieveCustomerByCriteriaResponse**))
    as element(ns3:FindCustomerResponse) {
        <ns3:FindCustomerResponse>
            <Customer>
                <ns2:ID>{ xs:long($retrieveCustomerByCriteriaResponse1/customers/id) }</ns2:ID>
                <ns2:FirstName>{ data($retrieveCustomerByCriteriaResponse1/customers/firstname) }</ns2:FirstName>
                <ns2:LastName>{ data($retrieveCustomerByCriteriaResponse1/customers/lastname) }</ns2:LastName>
                <ns2:EmailAddress>{ data($retrieveCustomerByCriteriaResponse1/customers/emailAddress) }</ns2:EmailAddress>
                <ns2:Addresses>
                    {
                        let $address := $retrieveCustomerByCriteriaResponse1/customers/address
                        return
                            <ns2:Address>
                                <ns2:Street>{ data($address/street) }</ns2:Street>
                                <ns2:PostalCode>{ data($address/zipcode) }</ns2:PostalCode>
                                <ns2:City>{ data($address/city) }</ns2:City>
                            </ns2:Address>
                    }
                </ns2:Addresses>
                <ns2:Rating>{ data($retrieveCustomerByCriteriaResponse1/customers/rating) }</ns2:Rating>
                <ns2:Gender>{ data($retrieveCustomerByCriteriaResponse1/customers/gender) }</ns2:Gender>
            </Customer>
        </ns3:FindCustomerResponse>
};

declare variable $retrieveCustomerByCriteriaResponse1 as element(ns0:RetrieveCustomerByCriteriaResponse) external;

xf:TransformFindCustomerResponse($ retrieveCustomerByCriteriaResponse1)

誰かがこのコードが何をするのか説明してもらえますか?この関数への入力パラメーターは何ですか?

4

1 に答える 1

0

この関数の入力はelement()であり、これは基本的にXMLスニペットです。関数内で使用される値に基づくと、おそらく次のような構造になっているはずです。

<ns0:RetrieveCustomerByCriteriaResponse>
  <ns0:customers>
    <ns0:id>1234</ns0:id>
    <ns0:firstname>John</ns0:firstname>
    <ns0:lastname>Smith</ns0:lastname>
    <ns0:emailAddress>you@gmail.com</ns0:emailAddress>
    <ns0:address>
      <ns0:street>Main Street</ns0:street>
      <ns0:zipcode>12345</ns0:zipcode>
      <ns0:city>New York</ns0:city>
    </ns0:address>
    <ns0:rating>5</ns0:rating>
    <ns0:gender>male</ns0:gender>
  </ns0:customer>
</ns0:RetrieveCustomerByCriteriaResponse>

XMLは半構造化されているため、入力スニペットから情報が欠落している可能性があることに注意してください(たとえば、電子メールアドレスがない)。もちろん、ここでは使用されていない多くの情報が含まれている可能性もあります。スクリプトが実際に行うことは、いくつかの単純なXPath式です。例えば

xs:long($retrieveCustomerByCriteriaResponse1/customers/id) }

最初に顧客の子に移動し、次にidの子に移動します。xs:longは、long値にキャストする型です。返されるのは次のようなものです(上記の入力に基づく):

<ns3:FindCustomerResponse>
  <Customers>
    <ns2:ID>1234</ns2:ID>
    <ns2:FirstName>John</ns2:FirstName>
    <ns2:LastName>Smith</ns2:LastName>
    <ns2:EmailAddress>you@gmail.com</ns2:EmailAddress>
    <ns2:Addresses>
      <ns2:Address>
        <ns2:Street>Main Street</ns2:Street>
        <ns2:PostalCode>12345</ns2:PostalCode>
        <ns2:City>New York</ns2:City>
      </ns2:Address>
    </ns2:Addresses>
    <ns2:Rating>5</ns2:Rating>
    <ns2:Gender>male</ns2:Gender>
  </Customer>
</ns3:FindCustomerResponse>

私が知らないこと(そして私は実際に知りたいと思うでしょう...)は、関数宣言のこれら2つのアスタリスク**が何を意味するかということです。私はこれまでそのような構文を見たことがありません。通常、アスタリスクは、名前空間のワイルドカードまたは数量詞としてのみ使用します。

于 2012-08-12T12:21:48.017 に答える