XPath位置/8月份访问的第二个城市



我有这个代码

<vacaciones>
<destino identificador="m036" tipo="unico">
<ciudad>Palma de Mallorca</ciudad>
<fecha_salida>
<dia>22</dia>
<mes>Abril</mes>
</fecha_salida>
</destino>
<destino identificador="i07" tipo="pack">
<ciudad>Milán</ciudad>
<ciudad>Florencia</ciudad>
<fecha_salida>
<dia>13</dia>
<mes>Agosto</mes>
</fecha_salida>
</destino>
<destino identificador="a456" tipo="unico">
<ciudad>Amsterdam</ciudad>
<fecha_salida>
<dia>17</dia>
<mes>Agosto</mes>
</fecha_salida>
</destino>
</vacaciones>

他们问我关于"从8月份开始,这些目的地访问的第二个城市"的表达

我也不确定他们说的是弗洛伦西亚还是阿姆斯特丹。

三个目的地:西班牙、意大利、荷兰。只有一个城市在8月份访问了两个城市,就在第三个阿姆斯特丹之前。是的,我想是弗洛伦西亚。

最短形式:

//destino[2]/ciudad[2]/text()

带条件表达式的最长表单:

//destino[count(./ciudad)>1][.//mes[.="Agosto"]]/ciudad[2]/text()

编辑:解释:

  • //表示文档中的任何位置
  • 。意思是自我
  • [2] 指第二个元素

所以如果我用文字翻译我发布的内容:

在文档中的任何位置查找必须符合这些条件的destino标记(//destino((括号[](

  • 包含1个以上的"ciudad"子标记([count(./ciudad(>1](
  • 在某处(//(包含一个名为"Agosto"的"mes"标记[.//mes[.="Agosta"]

一旦我们找到了符合条件的destino标签,我们就会得到第二个"ciudad"子标签(/ciudad[2](并检索其内容(/text(((。

我认为你必须使用更多的代码,而不仅仅是Xpath的代码,除非你确定"destinos"是按日期订购的(…(

我认为这就是那些问你这个问题的人真正想要的。。。

//ciudad[following-sibling::fecha_salida//dia=max(//ciudad[following-sibling::fecha_salida//mes='Agosto']/following-sibling::fecha_salida//dia) ]/text()

输出:

阿姆斯特丹

8月份访问了三个城市,前两个在13日,第三个在17日访问了阿姆斯特丹。因此,17日是8月的第二次访问日期。上面的表达式查找在8月份访问的城市,该城市的访问日期是该月日期中的最晚日期(最高日期或max()(,并选择该城市的名称。

顺便说一句,使用xquery做这件事会干净得多,但那是另一回事。

相关内容

最新更新