我正在使用XQuery进行练习,已经达到了必须获取xml文件每一天的最大值的地步。
我的文件处理的是城市全天最高温度。它多次出现在同一天,但一天中的时间却有所不同。我将为您提供一个示例,说明数据如何显示在XML文件中:
<hour>
<date>2019-2-18</date>
<data_hour>12:00</data_hour>
<temperature>17</temperature>
</hour>
<hour>
<date>2019-2-18</date>
<data_hour>13:00</data_hour>
<temperature>18</temperature>
</hour>
<hour>
<date>2019-2-19</date>
<data_hour>14:00</data_hour>
<temperature>20</temperature>
</hour>
<hour>
<date>2019-2-19</date>
<data_hour>15:00</data_hour>
<temperature>19</temperature>
</hour>
这个想法将是每天花费最多的时间,关于如何解决它的任何想法?
答案 0 :(得分:1)
如果XQuery 3.0可用,则可以使用group by
子句将每天的小时元素分组在一起,然后应用max
函数选择最高温度。在这段代码中,我假设您已将小时元素绑定到变量$hours
:
for $hour in $hours
group by $date := $hour/date
return
$date || ": " || max($hour/temperature)
根据您的源数据,这将返回两项:
"2019-2-19: 20",
"2019-2-18: 18"
我将保留它作为练习,以便您按日期对结果进行排序。在此过程中,您可能会达到日期的当前格式的限制,因此您需要将日期转换为符合xs:date
数据类型的值,该数据类型可以可靠地排序。
如果您仅限使用XQuery 1.0,请参阅XQuery 3.0 equivalent group by in xquery 1.0 version。
答案 1 :(得分:0)
尝试一下,像我添加的一样添加其他父标签
let $body := doc("1.xml")
for $i in distinct-values($body//hour/date)
return <Day value = "{data($i)}"> {
let $hours := (for $row in $body//hour
for $j in $row/date where xs:string(data($j)) = xs:string(data($i))
return fn:substring($row/data_hour, 1, 2))
return fn:max($hours)
}
</Day>
如果还考虑了分钟,请告诉我。