Я получил этот XML и просили указать, сколько элементов выражение возвращает:базы данных XPath запросов
<a>
<a>
<a>1</a>
<a>2</a>
</a>
<a>
<a>3</a>
<a>4</a>
</a>
</a>
Запросы XPath являются:
i) //a[a/text()=3]/a
ii) //a[a/a/text()=3]/a/a
iii) //a[a/text()=2][a/text()=3]
И ответы даны I) 2, ii) 4, iii) 0
Однако у меня были проблемы при попытке понять это. Для i),
Что я понимаю, во-первых, я проверяю предикат. // означает потомок потомка или self, поэтому я проверяю // ////3. Поскольку я получил 3 в указанном пути,
<a>
<a>
<a>3</a>
<a>4</a>
</a>
</a>
так что предикат является истинным. Затем я выполнить XPath запросов, который // а/а, который будет возвращать мне 2 в этом блоке:
<a>
<a>3</a>
<a>4</a>
</a>
содержит 2 внутри. Тогда для ii) сначала проверяем предикат // a/a/a/3, то же самое, что и выше, я получил этот путь. Поскольку предикат возвращает true, поэтому я буду выполнять запрос XPath, например // a/a/a. Но она не должна возвращаться как 1, так как я смотрю на это:
<a>
<a>
<a>1</a>
</a>
</a>
Я действительно путают о том, как проследить его, и я уверен, что моя концепция не так, как ответ неверен. Есть ли простой способ сделать это или, может быть, несколько лучших примеров?
Заранее благодарен!
спасибо за объяснение! Но просто быстрая проверка с вами по поводу последнего вопроса, поэтому // возвращает 7 элементов. Тогда первый предикат в основном найдет тот, у которого текстовый узел равен 2, в этом случае я остаюсь с родителем только . Затем, после этого, я выполняю еще один предикат, чтобы найти 3, но так как я остался с родителем 2, а 3 - у другого родителя, поэтому я не могу найти его и, таким образом, вернуть 0? Я на правильном пути? –
@WhoamI вот ты иди! Вот как работает последний XPath. Congrats! – har07