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>

我想找到文本为“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 属性上正确限制它?

此外,假设我有多个 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]which 从文档的开头开始并开始搜索任何内容,P1因此它始终是正确的。同样//P1[@X > 90]总是如此。

于 2009-12-30T21:44:11.093 回答
28

除了“//”问题之外,这个 XML 是对混合内容的一种非常奇怪的使用。text()='July'如果任何子文本节点正好等于 July,谓词将匹配该元素,这在您的示例中不正确,因为周围有空格。根据源 XML 的确切定义,我会选择[text()[normalize-space(.)='July'] and Quad/P1/@X > 90]

于 2009-12-30T22:25:02.817 回答