Положение XPath / второй город, который посетили в августе - PullRequest
0 голосов
/ 10 марта 2020

У меня есть этот код

<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>

И они спрашивают меня о выражении «Второй город, который посетили в этих местах, начиная с августа».

Я тоже не уверен, если они говорят о Флоренции или Амстердаме.

Ответы [ 3 ]

0 голосов
/ 11 марта 2020

Я думаю, что вы должны делать это с большим количеством кода, а не только с Xpath, если вы не уверены, что "destinos" приходят упорядоченными по дате (...)

0 голосов
/ 11 марта 2020

Я думаю, что это то, что те, кто задавал вам вопрос, действительно были после ...

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

Вывод:

Амстердам

Три города были посещены в августе, первые два 13-го и третий Амстердам 17-го. Итак, 17-е число - вторая дата визита в августе. Выражение выше ищет город, который посетил в августе и имеет дату посещения, которая является самой поздней (самой высокой или max()) из дат в этом месяце, и выбирает название этого города.

Как кроме того, было бы гораздо проще сделать это с помощью xquery, но это уже другая история.

0 голосов
/ 11 марта 2020

Три направления: Испания, Италия, Нидерланды. Только один с двумя городами посетили в августе, прямо перед третьим Амстердамом. Так что да, я полагаю, это Флоренция.

Кратчайшая форма:

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

Самая длинная форма с условным выражением:

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

РЕДАКТИРОВАТЬ : Пояснения :

  • // означает любое место в документе.
  • . означает «я» (ie ~ «начало этой точки»)
  • [2] означает второй элемент

Так что если я переведу словами то, что я написал:

В любом месте документа найдите тег destino (// destino), который должен соответствовать этим условиям (скобки [])

  • содержат более 1 дочернего тега "ciudad" ([count (./ciudad)>1])
  • содержит где-то (//) тег "mes", озаглавленный "Agosto" [.//mes[.="Agosto"]

Как только мы нашли тэг destino, который соответствует условию, мы получаем второй дочерний тэг "ciudad" (/ ciudad [2]) и извлекаем его содержимое (/text()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...