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

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

66
задан Ashish Aggarwal 20 March 2014 в 11:34
поделиться

2 ответа

Вообще я бы посчитал использование неподвижного // как дурной запах в XPath.

Попробуйте это:-

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

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

.
75
ответ дан 24 November 2019 в 15:04
поделиться

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

26
ответ дан 24 November 2019 в 15:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: