如何使用xquery在一个时间范围内接收xml个节点

How to receive xml nodes inside a time range by using xquery

我有一个 xml,里面有类似的东西

<SFEvents>
  <EventList>
    <Event>
      <ID>1111</ID>
      <Type>Measurement</Type>
      <TimeStamp>2015-09-28T09:50:27.514</TimeStamp>
      <Space>Main_area</Space>
      <SourceID>Thermometer_3</SourceID>
      <Content>
        <Measurement>
          <!-- From B2MML standard (OpSegmentDataType) -->
          <ID/>
          <Description>Temperature of a power resistance</Description>
          <Value>
            <ValueString>100</ValueString>
            <UnitOfMeasure>oC</UnitOfMeasure>
          </Value>
        </Measurement>
      </Content>
    </Event>
<Event>..</Event>
...
</EventList>

有很多事件,我目前尝试使用 xquery 接收时间戳在某个时间范围内的所有事件节点

我用这个代码

all_xmls_String=session.execute("xquery for $b in  doc('CIDEMdb/CIDEM.xml') 
let $date_string as xs:string :=$b/SFEvents/EventList/Event/TimeStamp/data() 
let $date as xs:dateTime := xs:dateTime($date_string)  
where $date ge xs:dateTime('"+startdate+"') and $date le 
xs:dateTime('"+enddate+"')  return $b/SFEvents/EventList");

但是我收到这个错误 无法将 xs:untypedAtomic+ 转换为 xs:string: ("2015-09-28T09:50:27.514", ...).

有什么想法吗?

问题是您正在遍历基数为 1 的 EventList 文档,而 selecting $b/SFEvents/EventList/Event/TimeStamp/data() 一系列 TimeStamp 值,并将其分配给需要单个值的变量。您的查询也 returns 和 EventList,但您说您想要 return Events.

有几种方法可以做到这一点,但是给定现有查询的最简单方法是简单地遍历 Event 元素,select 单个 TimeStamp 值,并且然后 return selected Events。

for $b in doc('CIDEMdb/CIDEM.xml')//SFEvents/EventList/Event
let $date_string as xs:string :=$b/TimeStamp/data() 
let $date as xs:dateTime := xs:dateTime($date_string)  
where $date ge xs:dateTime('"+startdate+"') and $date le xs:dateTime('"+enddate+"')  
return $b