2012-08-12 70 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