source

XPath를 사용하여 텍스트 내용과 속성 값을 기반으로 노드를 선택하려면 어떻게 해야 합니까?

factcode 2023. 10. 26. 21:51
반응형

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>

'7월' 텍스트와 Quad/P1/X 속성이 90보다 큰 노드를 찾고 싶습니다.따라서, 이 경우에는 어떠한 매치도 반환하지 않아야 합니다.그러나 GT(>) 또는 LT(<)를 사용하면 첫 번째 Word 요소가 일치합니다.eq(=)를 사용하면 상대가 되지 않습니다.

그래서:

//Word[text()='July' and //P1[@X < 90]]

진실로 돌아올 것입니다.

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

P1@X 속성에서 이를 적절하게 제한하려면 어떻게 해야 합니까?

또한 다른 페이지 번호에 대해 여러 개의 페이지 요소가 있다고 생각해 보십시오.다음과 같은 노드를 찾기 위해 위 검색을 추가로 제한하려면 어떻게 해야 합니까?text()='July', P1@X < 90, 및 페이지@pageNumber=3?

일반적으로 저는 XPath에서 고정되지 않은 //를 나쁜 냄새로 사용하는 것을 고려합니다.

한번 해보세요:-

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

당신의 문제는 당신이 사용한다는 것입니다.//P1[@X < 90]문서의 처음부터 다시 시작해서 어떤 것이든 사냥하기 시작합니다.P1그래서 그것은 언제나 진실일 것입니다.유사하게//P1[@X > 90]언제나 진실입니다.

"//" 문제를 제외하고 이 XML은 혼합 콘텐츠를 매우 이상하게 사용합니다.술어를text()='July'하위 텍스트 노드가 7월과 정확히 일치하는 경우 요소와 일치합니다. 이는 주변 공백 때문에 예제에서는 사실이 아닙니다.소스 XML의 정확한 정의에 따라, 저는 다음과 같이 할 것입니다.[text()[normalize-space(.)='July'] and Quad/P1/@X > 90]

언급URL : https://stackoverflow.com/questions/1982624/using-xpath-how-do-i-select-a-node-based-on-its-text-content-and-value-of-an-at

반응형