要在getListItemChanges方法中传递的动态日期

时间:2014-01-24 06:50:14

标签: soap wsdl xquery

我正在使用以下代码。它运作得很好。

<GetListItemChanges xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<listName>States At A Glance</listName>
<viewFields></viewFields>     
<since>2013-08-29T 19:52:52Z</since>
<contains></contains>
</GetListItemChanges>

我希望自标签中的日期时间是动态的。所以,我使用下面的xquery函数来计算它:

declare variable $Y := fn:concat(fn:substring(fn:string(fn:current-dateTime() - xs:dayTimeDuration('P30D')),1,11), ' ', fn:substring(fn:string(fn:current-dateTime() - xs:dayTimeDuration('P30D')),12,8), 'Z');

我测试了$ Y的值,它正是 - 我想要的。

但是,当我用$ Y替换日期值时,代码开始出错:

let $soap-payload := ('<GetListItemChanges xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<listName>States At A Glance</listName>
<since>{fn:data($Y)}</since>
</GetListItemChanges>')

错误消息:

axis2_svc_client_send_receive失败。 Web Service返回了soap故障。 错误类型:XQuery Engine错误。 soap:抛出了类型为“Microsoft.SharePoint.SoapServer.SoapServerException”的ReceiverException ..

1 个答案:

答案 0 :(得分:0)

您显示的代码不会执行替换。变量$soap-payload不包含XML,而是包含字符串。不会评估字符串内的XQuery表达式。如果从$soap-payload中删除单引号,则将评估XQuery表达式。

如果您需要$soap-payload作为字符串,可以通过字符串连接来构建它,或者您可以序列化XML。其机制取决于您的XQuery处理器(和版本)。

  • XQuery 3.0:fn:serialize()
  • MarkLogic Server:xdmp:quote()
  • 撒克逊人:saxon:serialize()

连接示例

XQuery 1.0

let $soap-payload :=
  fn:concat(
    '<GetListItemChanges xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <listName>States At A Glance</listName>
      <since>',
    fn:concat(
      $Y,
      '</since>
      </GetListItemChanges>'))

XQuery 3.0

let $soap-payload :=
  '<GetListItemChanges xmlns="http://schemas.microsoft.com/sharepoint/soap/">
     <listName>States At A Glance</listName>
     <since>' || $Y || '</since>
   </GetListItemChanges>'

序列化示例

let $soap-payload-xml :=
  <GetListItemChanges xmlns="http://schemas.microsoft.com/sharepoint/soap/">
    <listName>States At A Glance</listName>
    <since>{ $Y }</since>
  </GetListItemChanges>
let $soap-payload := fn:serialize($soap-payload-xml)