XPath: bovenliggende node ophalen van onderliggende node

Ik heb het bovenliggende knooppunt nodig voor het onderliggende knooppunt title 50

Op dit moment gebruik ik alleen

//*[title="50"]

Hoe kan ik de ouder krijgen?
Het resultaat zou de storenode moeten zijn.


<?xml version="1.0" encoding="utf-8"?>
<d:data xmlns:d="defiant-namespace" d:mi="23">
    <store d:mi="22">
        <book price="12.99" d:price="Number" d:mi="4">
            <title d:constr="String" d:mi="1">Sword of Honour</title>
            <category d:constr="String" d:mi="2">fiction</category>
            <author d:constr="String" d:mi="3">Evelyn Waugh</author>
        </book>
        <book price="8.99" d:price="Number" d:mi="9">
            <title d:constr="String" d:mi="5">Moby Dick</title>
            <category d:constr="String" d:mi="6">fiction</category>
            <author d:constr="String" d:mi="7">Herman Melville</author>
            <isbn d:constr="String" d:mi="8">0-553-21311-3</isbn>
        </book>
        <book price="8.95" d:price="Number" d:mi="13">
            <title d:constr="String" d:mi="10">50</title>
            <category d:constr="String" d:mi="11">reference</category>
            <author d:constr="String" d:mi="12">Nigel Rees</author>
        </book>
        <book price="22.99" d:price="Number" d:mi="18">
            <title d:constr="String" d:mi="14">The Lord of the Rings</title>
            <category d:constr="String" d:mi="15">fiction</category>
            <author d:constr="String" d:mi="16">J. R. R. Tolkien</author>
            <isbn d:constr="String" d:mi="17">0-395-19395-8</isbn>
        </book>
        <bicycle price="19.95" d:price="Number" d:mi="21">
            <brand d:constr="String" d:mi="19">Cannondale</brand>
            <color d:constr="String" d:mi="20">red</color>
        </bicycle>
    </store>
</d:data>

Antwoord 1, autoriteit 100%

Gebruik de parent-assenmet de naam van het bovenliggende knooppunt .

//*[title="50"]/parent::store

Deze XPath selecteert alleen de bovenliggende node als het een storeis.

Maar u kunt ook een van deze gebruiken

//*[title="50"]/parent::*
//*[title="50"]/..

Deze xpaths selecteren elk bovenliggend knooppunt. Dus als het document verandert, selecteert u altijd een knooppunt, zelfs als het niet het knooppunt is dat u verwacht.

BEWERKEN

Wat gebeurt er in het gegeven voorbeeld waar de ouder een fiets is maar de ouder van de ouder een winkel?

Gaat het omhoog?

Nee, het selecteert alleen de winkel als het een ouder is van het knooppunt dat overeenkomt met //*[title="50"].

Zo niet, is er dan een methode om in dergelijke gevallen op te stijgen en Geen terug te geven als er geen ouder is?

Ja, u kunt ancestor-assen

. gebruiken

//*[title="50"]/ancestor::store

Hiermee selecteert u alle voorouders van het knooppunt Matching //*[title="50"]DAT ZIJN `WINKELS. B.g

<data xmlns:d="defiant-namespace" d:mi="23">
    <store mi="1">
        <store mi="22">
            <book price="8.95" d:price="Number" d:mi="13">
                <title d:constr="String" d:mi="10">50</title>
                <category d:constr="String" d:mi="11">reference</category>
                <author d:constr="String" d:mi="12">Nigel Rees</author>
            </book>
        </store>
    </store>
</data>


Antwoord 2, Autoriteit 10%

Net als alternatief kunt u ancestorgebruiken.

//*[title="50"]/ancestor::store

Het is krachtiger dan parentOmdat het zelfs de grootouder of de grote grootouder van grootouder kan krijgen


Antwoord 3, Autoriteit 4%

U kunt de twee stippen ook aan het einde van de expressie gebruiken. Zie dit voorbeeld:

//*[title="50"]/..

Antwoord 4, Autoriteit 2%

Nieuw, verbeterd antwoord op een oude, veelgestelde vraag …

Hoe kan ik zijn ouder krijgen? Resultaat zou de storeNode moeten zijn.

Gebruik een predicaat in plaats van de parent::of ancestor::Axis

De meeste antwoorden hier selecteren de titleen gaan dan omhoog naar het beoogde ouder- of voorouderelement (store). Een eenvoudigere, directe benadering is om het ouder- of voorouderelement rechtstreeks te selecteren, zodat het niet nodig is om naar een parent::of ancestor::assen te gaan:

//*[book/title = "50"]

Moeten de tussenliggende elementen in naam verschillen:

//*[*/title = "50"]

Of, in naam en diepte:

//*[.//title = "50"]

Antwoord 5

Dit werkt in mijn geval. Ik hoop dat je er betekenis uit kunt halen.

//div[text()='building1' and @class='wrap']/ancestor::tr/td/div/div[@class='x-grid-row-checker']

Other episodes