Как сделать этот запрос XPath?

Я застрял с запросом XPath, который я пытаюсь сделать. Я хочу сосчитать всю рыбу в течение определенной луны. Для полной луны запрос должен возвращать 2 (в течение этой луны 2 рыбы) Мой текущий запрос: count(//fish[//moon="full"]) . Что здесь не так? Считает всю рыбу вместо 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 ответа


Ваш 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)

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

count(//week[moon="full"]/catch/fish) -> 2.0
count(//week[moon="half"]/catch/fish) -> 1.0

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

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


Есть идеи?

10000