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 № 1Usa 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