2012-08-12 32 views
0

我使用的工具來繪製此XQuery的,但需要了解的工具做幕後如何避免自己成爲一個奴隸的工具需要了解下面的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)

有人可以解釋一下這段代碼的作用嗎? 該功能的輸入參數是什麼?

回答

0

該函數的輸入是一個element(),它基本上是一個XML片段。基於在函數中使用的值應該可能有這樣的結構:

<ns0:RetrieveCustomerByCriteriaResponse> 
    <ns0:customers> 
    <ns0:id>1234</ns0:id> 
    <ns0:firstname>John</ns0:firstname> 
    <ns0:lastname>Smith</ns0:lastname> 
    <ns0:emailAddress>[email protected]</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) } 

先穿過顧客小孩,然後穿過身份證小孩。 xs:long是一個類型轉換爲long值的類型。你將得到的回覆是這樣的(基於上面的輸入):

<ns3:FindCustomerResponse> 
    <Customers> 
    <ns2:ID>1234</ns2:ID> 
    <ns2:FirstName>John</ns2:FirstName> 
    <ns2:LastName>Smith</ns2:LastName> 
    <ns2:EmailAddress>[email protected]</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> 

什麼我不知道(我實際上是非常有興趣知道...)北京時間什麼這兩個星號* *在函數聲明中的意思。我從來沒有見過這樣的語法。通常,只使用星號作爲名稱空間的通配符或作爲量詞。

+0

Dirkk道歉我想大膽的xquery函數和stackoverflow代碼編輯器的參數在參數前加了雙重astresix – 2012-08-14 05:45:04