2009-07-15 8 views

Répondre

16

Il s'avère que l'outil ne prend pas en charge XPath 2.0.

XPath 1.0 ne pas la fantaisie min() et max() fonctions, afin de trouver ces valeurs que nous devons être un peu délicat avec la logique XPath et comparer les valeurs sur les frères et sœurs du nœud:

maximum :

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

minimum:

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

Si l'intégration de ces requêtes dans des fichiers XML comme XSLT s ou fourmi Cripts, n'oubliez pas de coder < et > comme &lt; en respectant &gt;.

+0

bon travail! J'ai d'abord essayé la solution la mieux classée, mais celle-ci n'exclut pas les maxima/minima en double. – udo

5

Cela devrait fonctionner ...

max(foo/bar/@score) 

... et ...

min(foo/bar/@score) 

... consultez ce function reference.

+0

Ok. C'est XPath 2.0, je vais vérifier. – brasskazoo

+0

Oui, XPath 2.0. –

3

Essayez ceci:

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

Peut-être que cela fonctionnera sur XPath 1.0.

36

Voici une solution légèrement plus courte.

Maximum:

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

minimum:

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

J'ai édité le prédicat afin qu'il soit applicable à toute séquence de bar, même si vous décidez de changer le chemin. Notez que parent d'attribut est l'élément auquel il appartient.

Si l'intégration de ces requêtes dans des fichiers XML comme des scripts XSLT ou fourmi, souvenez-vous de coder < et > comme &lt; respectant &gt;.

+0

Cool ... mais je ne peux pas garantir qu'il n'y aura pas (par exemple) plusieurs valeurs maximales de 'score'. Cela afficherait une valeur pour chaque élément qui contenait le maximum. – brasskazoo

+1

True - modifié pour tenir compte de cela. –

+0

Probablement vous voulez utiliser 'number (.)' Car sinon il compare les valeurs de chaîne des attributs. Ai-je raison? – DanSkeel

4

je suis tombé sur le fil et n'a pas trouvé une réponse qui a fonctionné pour moi, alors où est ce que j'ai finalement fini par utiliser ...

sorties la plus faible valeur, vous pourriez bien sûr choisir de sortie le @id du noeud avec la valeur la plus basse au lieu de choisir.

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

Même chose pour la valeur maximale:

<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

Je sais que cela cinq ans. Juste ajouter quelques options supplémentaires pour quiconque peut chercher et trouver cela.

Quelque chose de similaire à cela a fonctionné pour moi dans XSLT 2.0.

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

Le !='' était d'éviter un nulls amené des valeurs NaN (il y a probablement une meilleure façon de le faire)

Voici un XPath/XQuery travail:

//bar/@score[@score=min(//*[@score !='']/number(@score))] 
Questions connexes