代码之家  ›  专栏  ›  技术社区  ›  marc esher

使用XPath,如何根据节点的文本内容和属性值选择节点?

  •  65
  • marc esher  · 技术社区  · 15 年前

    鉴于此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(<),我得到了第一个单词元素的匹配。如果我使用eq(=),我就没有对手。

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

    会像will一样返回true

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

    如何将其适当地约束到P1@X属性

    另外,假设我有多个页面元素,用于不同的页码。我如何额外约束上述搜索以查找具有 text()='July', P1@X < 90 ,及第页 @pageNumber=3 ?

    2 回复  |  直到 10 年前
        1
  •  78
  •   AnthonyWJones    15 年前

    一般来说,我会考虑在XPath中使用非前缀/作为一种难闻的气味。

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

    你的问题是你使用了 //P1[@X < 90] P1 //P1[@X > 90] 这永远是真的。

        2
  •  27
  •   Mads Hansen    15 年前

    除了“/”问题之外,这种XML对混合内容的使用非常奇怪。谓词 text()='July' [text()[normalize-space(.)='July'] and Quad/P1/@X > 90]