72

この 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]]

true を返します。

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

これを P1@X 属性で適切に制約するにはどうすればよいですか?

さらに、異なるページ番号に対して複数の Page 要素があるとします。text()='July', P1@X < 90、および Page でノードを見つけるために、上記の検索をさらに制限するにはどうすればよい@pageNumber=3ですか?

4

2 に答える 2

79

一般に、接頭辞なしの // の使用は、XPath の悪臭と見なされます。

これを試して:-

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

あなたの問題は//P1[@X < 90]、ドキュメントの先頭から始まり、任意のハンティングを開始するを使用しているP1ため、常に true になることです。同様//P1[@X > 90]に常に真です。

于 2009-12-30T21:44:11.093 に答える
28

「//」の問題とは別に、このXMLは混合コンテンツの非常に奇妙な使用法です。text()='July'子テキストノードのいずれかが7月と正確に等しい場合、述語は要素と一致します。これは、周囲の空白のため、この例では当てはまりません。ソースXMLの正確な定義に応じて、私は[text()[normalize-space(.)='July'] and Quad/P1/@X > 90]

于 2009-12-30T22:25:02.817 に答える