Подтвердить что ты не робот

Использование XPath, как выбрать node на основе его текстового содержимого и значения атрибута?

Учитывая этот 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?

Кроме того, представьте, что у меня есть несколько элементов страницы, для разных номеров страниц. Как бы я дополнительно сдерживал вышеуказанный поиск, чтобы найти Узлы с text()='July', [email protected] < 90 и Page @pageNumber=3?

4b9b3361

Ответ 1

В общем, я бы рассмотрел использование unsrefixed//как плохой запах в XPath.

Попробуйте следующее: -

/DocText/WithQuads/Page/Word[text()='July' and Quad/P1/@X > 90]

Ваша проблема заключается в том, что вы используете //P1[@X < 90], который начинается с начала документа и начинает поиск любого P1, поэтому он всегда будет правдой. Точно так же //P1[@X > 90] всегда истинно.

Ответ 2

Помимо формы "//", этот XML - очень странное использование смешанного контента. Предикат text()='July' будет соответствовать элементу, если любой дочерний текст node точно равен июлю, что не соответствует вашему примеру из-за окружающих пробелов. В зависимости от точного определения исходного XML я бы пошел на [text()[normalize-space(.)='July'] and Quad/P1/@X > 90]