Как я могу сравнить узел с другим узлом того же типа в XPATH? - PullRequest
0 голосов
/ 27 мая 2020

Для моей домашней работы мне задали в XPATH вопрос, на который я не могу ответить. Вот вопрос: «Предоставьте выражение XPath, которое из элемента возвращает количество людей после (в порядке документа) того, чей почтовый индекс является текущим узлом».

<addressbook xmlns="https://esi-bru.be/WEBR4"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="https://esi-bru.be/WEBR4 addressbook.xsd">
    <persons>
        <person id='p1'>
            <identity>
                <lastname>Loiselle</lastname>
                <firstnames>
                    <firstname>Raymond</firstname>
                    <firstname>Claude</firstname>
                </firstnames>
                <sex>MALE</sex>
                <birth>1991-10-15</birth>
                <death>NULL</death>
            </identity>
            <addresses>
                <postal>
                    <country_id>BE</country_id>
                    <postalcode>4850</postalcode>
                    <city>Plombières</city>
                    <street>Rue Basse</street>
                    <number>113</number>
                </postal>
                <emails>
                    <email use='PROFESSIONAL'>natoque.penatibus@loremipsumsodales.org</email>
                    <email use='PRIVATE'>id@lacusMaurisnon.net</email>
                </emails>
                <phones>
                    <phone use='PRIVATE' type='LANDLINE'>042082616</phone>
                    <phone use='PRIVATE' type='CELLPHONE'>0497806590</phone>
                    <phone use='PROFESSIONAL' type='LANDLINE'>022966411</phone>
                    <phone use='PROFESSIONAL' type='IPPHONE'>082648320</phone>
                </phones>
            </addresses>
            <relations>
                <relation>
                    <person_id>p3</person_id>
                    <level>1</level>
                </relation>
                <relation>
                    <person_id>p7</person_id>
                    <level>-1</level>
                </relation>
                <relation>
                    <person_id>p12</person_id>
                    <level>0</level>
                </relation>
                <relation>
                    <person_id>p5</person_id>
                    <level>3</level>
                </relation>
            </relations>
        </person>
        <person id='p2'>
            <identity>
                <lastname>Frueh</lastname>
                <firstnames>
                    <firstname>Andreas</firstname>
                </firstnames>
                <sex>MALE</sex>
                <birth>1984-04-15</birth>
                <death>NULL</death>
            </identity>
            <addresses>
                <postal>
                    <country_id>DE</country_id>
                    <postalcode>4850</postalcode>
                    <city>Vettelschoß</city>
                    <street>Wallstrasse</street>
                    <number>21</number>
                </postal>
                <emails>
                    <email use='PRIVATE'>Aenean.eget@etlibero.net</email>
                    <email use='PROFESSIONAL'>Proin.nisl.sem@vitaevelitegestas.edu</email>
                </emails>
                <phones>
                    <phone use='PRIVATE' type='LANDLINE'>03327839582</phone>
                    <phone use='PRIVATE' type='CELLPHONE'>017436797167</phone>
                    <phone use='PROFESSIONAL' type='LANDLINE'>07056419296</phone>
                    <phone use='PROFESSIONAL' type='IPPHONE'>09747178748</phone>
                </phones>
            </addresses>
            <relations>
                <relation>
                    <person_id>p14</person_id>
                    <level>4</level>
                </relation>
                <relation>
                    <person_id>p1</person_id>
                    <level>2</level>
                </relation>
                <relation>
                    <person_id>p3</person_id>
                    <level>-1</level>
                </relation>
                <relation>
                    <person_id>p10</person_id>
                    <level>1</level>
                </relation>
                <relation>
                    <person_id>p11</person_id>
                    <level>1</level>
                </relation>
                <relation>
                    <person_id>p6</person_id>
                    <level>2</level>
                </relation>
                <relation>
                    <person_id>p5</person_id>
                    <level>2</level>
                </relation>
            </relations>
        </person>
        <person id='p3'>
            <identity>
                <lastname>Diederich</lastname>
                <firstnames>
                    <firstname>Juliane</firstname>
                </firstnames>
                <sex>FEMALE</sex>
                <birth>1963-12-23</birth>
                <death>2005-05-02</death>
            </identity>
            <addresses>
                <postal>
                    <country_id>DE</country_id>
                    <postalcode>56414</postalcode>
                    <city>Oberahr</city>
                    <street>Stuttgarter Platz</street>
                    <number>75</number>
                </postal>
                <emails>
                    <email use='PRIVATE'>Aenean.eget@etlibero.net</email>
                </emails>
                <phones/>
            </addresses>
            <relations>
                <relation>
                    <person_id>p12</person_id>
                    <level>4</level>
                </relation>
                <relation>
                    <person_id>p11</person_id>
                    <level>4</level>
                </relation>
                <relation>
                    <person_id>p1</person_id>
                    <level>4</level>
                </relation>
            </relations>
        </person>
    </persons>
</addressbook>

Я начал запрос, но не совсем понимаю, как. работает и каким будет мой текущий узел. как я могу сравнить со всеми другими узлами того же типа в порядке, не беря тот, у которого есть position () <почтовый индекс, который я сравниваю с другим. </p>

запрос:

//postalcode/(count(./text() = //person/addresses/postal/postalcode/text()))

Я не обязательно прошу исправить запрос, но больше, чтобы иметь возможность лучше понять определенные концепции, чтобы иметь возможность ответить на него.

Извините за мой плохой английский sh кстати ..

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вот некоторые ключевые принципы, которые необходимо понять для решения вашей домашней задачи:

  1. Ваш XML имеет пространство имен по умолчанию. См. Как XPath работает с пространствами имен XML?

  2. Предикаты следует помещать в [ ], а не в ( ).

  3. Ось following:: или following-sibling:: поможет вам ограничить выбор точками вперед в порядке документа от целевого элемента. Пример: Захватить следующих братьев и сестер в XPath?

0 голосов
/ 27 мая 2020

Если желаемый результат - это число, первая часть вашего выражения должна начинаться с count.

Подстановочный знак * и [position number] тоже должны быть полезны.

Шаблон вашего XPath будет выглядеть так:

count(path to first element[predicate][position number]/axis::something[predicate])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...