Как сделать этот запрос XPath? - PullRequest
0 голосов
/ 25 марта 2020

Я застрял с запросом XPath, который я пытаюсь сделать. Я хочу сосчитать все фи sh в течение определенной луны. Для полной луны запрос должен возвращать 2 (в течение этой луны 2 фи sh) Мой текущий запрос такой: count(//fish[//moon="full"]). Что здесь не так? Он подсчитывает все фи sh вместо только 2.

XML выглядит следующим образом:

<winterfishing>
<week number = "3">
   <moon>full</moon>
   <catch>
      <fish>
         <species>bass</species>
      </fish>
      <fish>
         <species>pike perch</species>
      </fish>
   </catch>
   <moon>
</week>
<week number = "4">
   <moon>half</moon>
   <catch>
      <fish>
         <species>perch</species>
      </fish>
   </catch>
   <moon>
</week>
</winterfishing>

Ответы [ 3 ]

1 голос
/ 25 марта 2020

Ваш XML не правильно сформирован. Поэтому мне пришлось сначала исправить это.

XML

<winterfishing>
    <week number="3">
        <moon>full</moon>
        <catch>
            <fish>
                <species>bass</species>
            </fish>
            <fish>
                <species>pike perch</species>
            </fish>
        </catch>
        <!--<moon>-->
    </week>
    <week number="4">
        <moon>half</moon>
        <catch>
            <fish>
                <species>perch</species>
            </fish>
        </catch>
        <!--<moon>-->
    </week>
</winterfishing>

XPath

count(/winterfishing/week[moon="full"]/catch/fish)
0 голосов
/ 26 марта 2020

По сути, вы использовали //, не понимая, что это значит. moon выбирает элементы с именем moon, которые являются дочерними элементами контекстного узла. //moon выбирает элементы с именем moon в любом месте текущего документа.

Не пытайтесь получить выражения XPath методом проб и ошибок, вас ждет множество неприятных сюрпризов. Очень заманчиво думать, что XPath - это такой маленький язык, что вы можете поднять его «на слух», но есть много неожиданных причуд, и гораздо лучше потратить пару часов на чтение spe c и понимание концепций до Вы начинаете кодировать.

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

При удалении потерянных, плохо формируемых тегов <moon>, тогда рабочие запросы:

count(//week[moon="full"]/catch/fish) -> 2.0
count(//week[moon="half"]/catch/fish) -> 1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...