/ / XPath 2.0: trova tutti i discendenti che corrispondono ai criteri X, ma senza criteri di corrispondenza degli antenati Y - xml, xpath-2.0

XPath 2.0: Trova tutti i discendenti che corrispondono ai criteri X, ma senza i criteri di corrispondenza degli antenati Y - xml, xpath-2.0

Dato l'xml:

<div itemtype="..." itemscope value="root">
<div itemprop="..." value="1" /> <!-- want this -->
<div value="2">
<div itemprop="..." value="3" /> <!-- and this -->
</div>
<div itemtype="..." itemscope itemprop="..." value="4"> <!-- and even this -->
<div itemprop value="5" /> <!-- but not this -->
<div value="6" >
<div itemprop value="7" > <!-- nor this -->
</div>
</div>
</div>

Sto cercando di creare una query xpath che restituisca tutti i discendenti della radice, che hanno un itemprop attributo, ma non sono discendenti di un elemento "annidato" con il itemscope attributo. Cioè, voglio tutte le proprietà della radice, ma non le proprietà all'interno degli ambiti annidati. Sono abbastanza convinto che questo non può essere fatto in XPath 1.0. Il mio tentativo ingenuo: /descendant::*[not(@itemscope)]//*[@itemprop] restituisce tutto itemprop"Gli elementi che hanno un antenato con no itemscope attributo

EDIT: Ho bisogno di una soluzione abbastanza generale, che funzionerà per il recupero del itemprops in ogni livello del documento, non solo la radice. ad esempio, nel mio esempio, recuperando le proprietà di "d"

risposte:

1 per risposta № 1

Usa questa espressione XPath 1.0:

//*[@itemprop and not(ancestor::*[parent::* and @itemscope])]

Questo seleziona tutti gli elementi con un itemprop attributo che non ha un antenato con un itemscope attributo, che (questo antenato) ha un elemento genitore (questo significa che non è l'elemento-documento stesso).

Per verificare esattamente la selezione degli elementi desiderati, usa questa espressione leggermente modificata (la modifica lo rende un'espressione XPath 2.0):

//*[@itemprop and not(ancestor::*[parent::* and @itemscope])]/@value/string()

questo produce il valore di stringa del value attributo di ogni elemento selezionato.

Quando viene valutata l'espressione XPath di cui sopra su questo documento XML di origine (quello fornito, ma corretto per renderlo un documento XML ben formato:

<div itemtype="..." itemscope="x" value="root">
<div itemprop="..." value="1" /> <!-- want this -->
<div value="2">
<div itemprop="..." value="3" /> <!-- and this -->
</div>
<div itemtype="..." itemscope="x" itemprop="..." value="4"> <!-- and even this -->
<div itemprop="..." value="5" /> <!-- but not this -->
<div value="6" >
<div itemprop="..." value="7" /> <!-- nor this -->
</div>
</div>
</div>

il risultato desiderato e corretto viene prodotto:

1 3 4

1 per risposta № 2

Che ne dite di //div[not(ancestor::div[ancestor::div[./@itemscope]]/@itemscope)]/@itemprop

lettura: tutte le div che non hanno un antenato con itemscope, che lui stesso ha un itemscope antenato, ottieni attributo itemprop

Ho dovuto apportare alcune modifiche, perché il tuo XML non è veramente conforme a XML:

<root>
<div itemtype="a" itemscope="" value="root">
<div itemprop="b" value="1" />
<!-- want this -->
<div value="2">
<div itemprop="c" value="3" />
<!-- and this -->
</div>
<div itemtype="d" itemscope="" itemprop="e" value="4">
<!-- and even this -->
<div itemprop="f" value="5" />
<!-- but not this -->
<div value="6" >
<div itemprop="g" value="7" />
<!-- nor this -->
</div>
</div>
</div>
</root>

L'XPath restituisce:

Attr    itemprop    b
Attr    itemprop    c
Attr    itemprop    e