2009-07-15 11 views

risposta

16

Lo strumento non supporta XPath 2.0.

XPath 1.0 non ha la fantasia e min()max() funzioni, in modo per trovare questi valori abbiamo bisogno di essere un po 'difficile con la logica XPath, e confronta i valori sui fratelli del nodo:

massima :

/foo/bar[not(preceding-sibling::bar/@score >= @score) 
    and not(following-sibling::bar/@score > @score)]/@score 

minima:

/foo/bar[not(preceding-sibling::bar/@score <= @score) 
    and not(following-sibling::bar/@score < @score)]/@score 

Se incorporare queste query in file XML come XSLT o formica s cripts, ricorda di codificare < e > come &lt; rispettando &gt;.

+0

bel lavoro! Ho provato per prima la soluzione classificata, ma quella non esclude i massimi/minimi duplicati. – udo

5

Questo dovrebbe funzionare ...

max(foo/bar/@score) 

... e ...

min(foo/bar/@score) 

... controlla questo function reference.

+0

Ok. Questo è XPath 2.0, lo controllerò. – brasskazoo

+0

Sì, XPath 2.0. –

3

Prova questa:

//foo/bar[not(preceding-sibling::bar/@score <= @score) and not(following-sibling::bar/@score <= @score)] 

Forse questo funzionerà su XPath 1.0.

36

Ecco una soluzione leggermente più breve.

massima:

/foo/bar/@score[not(. < ../../bar/@score)][1] 

minima:

/foo/bar/@score[not(. > ../../bar/@score)][1] 

Ho modificato il predicato in modo che sia applicabile a qualsiasi sequenza di bar, anche se si decide di modificare il percorso. Nota che il genitore dell'attributo è l'elemento a cui appartiene.

Se incorporare queste query in file XML come XSLT o script Ant, ricordarsi di codificare < e > come &lt; rispetto &gt;.

+0

Cool ... ma non posso garantire che il non ci sarà (per esempio) più valori massimi di 'punteggio'. Questo elencherebbe un valore per ogni elemento che conteneva il massimo. – brasskazoo

+1

Vero - modificato per tener conto di ciò. –

+0

Probabilmente si desidera utilizzare 'numero (.)' Perché altrimenti confronta i valori stringa degli attributi. Ho ragione? – DanSkeel

4

mi sono imbattuto il filo e non ha trovato una risposta che ha funzionato per me, in modo da dove è quello che alla fine ho finito per usare ...

uscite il valore più basso, ovviamente si può scegliere di uscita @id dal nodo con il valore più basso anziché da te scelto.

<xsl:for-each select="/foo"> 
    <xsl:sort select="@score"/> 
    <xsl:if test="position()=1"> 
    <xsl:value-of select="@score"/> 
    </xsl:if> 
</xsl:for-each> 

Lo stesso per il valore massimo:

<xsl:for-each select="/foo"> 
    <xsl:sort select="@score" order="descending"/> 
    <xsl:if test="position()=1"> 
    <xsl:value-of select="@score"/> 
    </xsl:if> 
</xsl:for-each> 
3

So che questo è di cinque anni. Aggiungo solo alcune altre opzioni per chiunque possa cercare e imbattersi in questo.

Qualcosa di simile a questo ha funzionato per me in XSLT 2.0.

min(//bar[@score !='']/@score) 

La !='' è stato quello di evitare una null che hanno portato i valori NaN (probabilmente c'è un modo migliore per farlo)

Questo vuole essere un lavoro XPath/XQuery:

//bar/@score[@score=min(//*[@score !='']/number(@score))] 
Problemi correlati