code

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

codestyles 2020. 11. 15. 11:18
반응형

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>

텍스트가 'July'이고 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', 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

반응형