Учитывая этот XML:
<DocText>
<WithQuads>
<Page pageNumber="3">
<Word>
July
<Quad>
<P1 X="84" Y="711.25" />
<P2 X="102.062" Y="711.25" />
<P3 X="102.062" Y="723.658" />
<P4 X="84.0" Y="723.658" />
</Quad>
</Word>
<Word>
</Word>
<Word>
30,
<Quad>
<P1 X="104.812" Y="711.25" />
<P2 X="118.562" Y="711.25" />
<P3 X="118.562" Y="723.658" />
<P4 X="104.812" Y="723.658" />
</Quad>
</Word>
</Page>
</WithQuads>
Я хотел бы найти узлы, которые имеют текст 'июля' и атрибута Quad/P1/X, Больше, чем 90. Таким образом, в этом случае, это не должно возвращать соответствия. Однако, если я использую GT (>) или LT (<), я получаю соответствие на первом элементе Word. Если я использую eq (=), я не получаю соответствия.
Так:
//Word[text()='July' and //P1[@X < 90]]
возвратит true, как будет
//Word[text()='July' and //P1[@X > 90]]
Как я ограничиваю это правильно на атрибуте P1@X?
Кроме того, предположите, что у меня есть несколько элементов Page для различных номеров страниц. Как я дополнительно вынудил бы вышеупомянутый поиск находить Узлы с text()='July', P1@X < 90
, и Page@pageNumber=3
?
Вообще я бы посчитал использование неподвижного // как дурной запах в XPath.
Попробуйте это:-
/DocText/WithQuads/Page/Word[text()='July' and Quad/P1/@X > 90]
Ваша проблема в том, что вы используете //P1[@X < 90]
, который начинается еще в начале документа и начинает охотиться за любым P1
, следовательно, это всегда будет правдой. Аналогично //P1[@X > 90]
всегда истинно.
Кроме вопроса "//", этот XML представляет собой очень странное использование смешанного контента. Предикат text()='July'
будет соответствовать элементу, если любой дочерний текстовый узел в точности равен июлю, что не верно в вашем примере из-за окружающих пробельных символов. В зависимости от точного определения исходного XML, я бы выбрал [text()[normalize-space(. )='July'] и Quad/P1/@X > 90]