XPath 3.x - 排序函数

Luk*_*kas 3 xml xpath xpath-3.0

我需要使用纯 XPath 3.0 对元素序列进行排序,因此没有 XQuery、没有 XSL-T 也没有代码。我尝试按照这个关于如何使用排序函数的答案,但我不是 XPath 专家,所以我不知道如何使用它。

\n\n

所以,我的文档基本上有以下结构:

\n\n
<?xml version="1.0" encoding="UTF-8"?>\n<AppointmentList>\n    <Appointment id="11" creatorID="1" creationDate="2018-03-01" reschedulable="ja" appointmentSeries="ja">\n        <Start date="2018-03-14" time="12:00:00"/>\n        <End date="2018-03-14" time="13:30:00"/>\n        <Description>Vorf\xc3\xbchrung</Description>\n    </Appointment>\n\n    <Appointment id="22" creatorID="2" creationDate="2018-02-14" reschedulable="ja" appointmentSeries="nein">\n        <Start date="2018-03-20" time="13:00:00"/>\n        <End date="2018-03-20" time="14:00:00"/>        \n        <Description>Programm Meeting</Description>\n        <Benachrichtigung art="EMail"/>\n    </Appointment>\n\n    <Appointment id="33" creatorID="3" creationDate="2018-02-23" reschedulable="nein" appointmentSeries="ja">\n        <Start date="2018-02-24" time="15:00:00"/>\n        <End date="2018-02-24" time="16:00:00"/>        \n        <Description>Burglary Report</Description>\n        <Benachrichtigung art="Beep"/>\n    </Appointment>\n\n    <Appointment id="44" creatorID="1" creationDate="2018-01-01" reschedulable="nein" appointmentSeries="nein">\n        <Start date="2018-05-01" time="10:00:00"/>\n        <End date="2018-05-01" time="17:00:00"/>        \n        <Description>Besprechung Ministerium</Description>\n    </Appointment>\n\n    <Appointment id="55" creatorID="8" creationDate="2018-02-28" reschedulable="nein" appointmentSeries="nein">\n        <Start date="2018-06-08" time="08:00:00"/>\n        <End date="2018-06-09" time="18:00:00"/>        \n        <Description>Spam Konferenz</Description>\n    </Appointment>\n\n    <Appointment id="66" creatorID="10" creationDate="2018-03-22" reschedulable="nein" appointmentSeries="nein">\n        <Start date="2018-05-07" time="08:00:00"/>\n        <End date="2018-05-07" time="18:00:00"/>        \n        <Description>XML Tutorium</Description>\n    </Appointment>\n\n    <Appointment id="77" creatorID="9" creationDate="2018-03-15" reschedulable="ja" appointmentSeries="nein">\n        <Start date="2018-04-20" time="08:00:00"/>\n        <End date="2018-04-20" time="09:00:00"/>        \n        <Description>Abschlusspr\xc3\xbcfung</Description>\n    </Appointment>\n\n    <Appointment id="88" creatorID="7" creationDate="2018-03-09" reschedulable="nein" appointmentSeries="ja">\n        <Start date="2018-03-14" time="17:00:00"/>\n        <End date="2018-03-14" time="18:00:00"/>        \n        <Description>Versammlung Workaholics</Description>\n    </Appointment>\n\n    <Appointment id="99" creatorID="6" creationDate="2018-02-01" reschedulable="nein" appointmentSeries="nein">\n        <Start date="2018-02-28" time="10:00:00"/>\n        <End date="2018-02-28" time="17:00:00"/>        \n        <Description>Fortbildung Datenbanken</Description>\n    </Appointment>\n</AppointmentList>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想将接下来的三个约会按日期升序排列。因此,从现在开始的下一个约会位于结果序列的第一个位置,而从距现在最近的第三个日期开始的约会应该是序列的最后一个元素。下面显示的查询为我提供了尚未发生的约会,但我不知道如何正确应用排序功能。

\n\n
/AppointmentList/Appointment[fn:dateTime(Start/@date, Start/@time) > fn:current-dateTime()]\n
Run Code Online (Sandbox Code Playgroud)\n\n

谢谢,因为我无法找到有关 fn:sort 函数的任何好的文档。

\n

Leo*_*ler 5

该函数fn:sort(...)存在三个版本,最多带有三个参数:

\n\n
    \n
  1. $input as item()*:输入序列,
  2. \n
  3. $collation as xs:string?:字符串比较的排序规则(或空序列),
  4. \n
  5. $key as function(item()) as xs:anyAtomicType*) as item()*:从要排序的项目中提取排序键(即应该比较的部分)的功能项。
  6. \n
\n\n

由于您不想对字符串进行排序,因此第二个参数应该是()

\n\n

您案例中的排序是每个约会的开始日期和时间。因此,您需要提供一个函数项,给定一个Appointment节点,该函数项返回xs:dateTime其开始日期:function($app) { fn:dateTime($app/Start/@date, $app/Start/@time) }

\n\n

将所有内容放在一起:

\n\n
subsequence(\n  sort(\n    /AppointmentList/Appointment[fn:dateTime(Start/@date, Start/@time) > fn:current-dateTime()],\n    (),\n    function($app) { fn:dateTime($app/Start/@date, $app/Start/@time) }\n  ),\n  1,\n  3\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
<Appointment id="77" creatorID="9" creationDate="2018-03-15" reschedulable="ja" appointmentSeries="nein">\n  <Start date="2018-04-20" time="08:00:00"/>\n  <End date="2018-04-20" time="09:00:00"/>\n  <Description>Abschlusspr\xc3\xbcfung</Description>\n</Appointment>\n<Appointment id="44" creatorID="1" creationDate="2018-01-01" reschedulable="nein" appointmentSeries="nein">\n  <Start date="2018-05-01" time="10:00:00"/>\n  <End date="2018-05-01" time="17:00:00"/>\n  <Description>Besprechung Ministerium</Description>\n</Appointment>\n<Appointment id="66" creatorID="10" creationDate="2018-03-22" reschedulable="nein" appointmentSeries="nein">\n  <Start date="2018-05-07" time="08:00:00"/>\n  <End date="2018-05-07" time="18:00:00"/>\n  <Description>XML Tutorium</Description>\n</Appointment>\n
Run Code Online (Sandbox Code Playgroud)\n