¿Cómo puedo usar XPath para encontrar el valor mínimo de un atributo en un conjunto de elementos?

Si tengo XML como:

    ...  

¿Puedo usar XPath para encontrar los valores mínimo y máximo de score ?

Editar : La herramienta que estoy usando (tareas de Andariel Ant) no es compatible con la solución XPath 2.0.

    Aquí hay una solución un poco más corta.

    Máximo:

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

    Mínimo:

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

    He editado el predicado para que sea aplicable a cualquier secuencia de bar , incluso si decides cambiar la ruta. Tenga en cuenta que el padre del atributo es el elemento al que pertenece.

    Si incrusta estas consultas en archivos XML como XSLT o scripts ant, recuerde codificar < y > como < respetando > .

    Resulta que la herramienta no es compatible con XPath 2.0.

    XPath 1.0 no tiene las funciones de lujo min() y max() , por lo que para encontrar estos valores necesitamos ser un poco difíciles con la lógica de XPath, y comparar los valores en los hermanos del nodo:

    Máximo:

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

    Mínimo:

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

    Si incrusta estas consultas en archivos XML como XSLT o scripts ant, recuerde codificar < y > como < respetando > .

    Esto debería funcionar …

     max(foo/bar/@score) 

    … y …

     min(foo/bar/@score) 

    … mira esta referencia de función .

    Me encontré con el hilo y no encontré una respuesta que funcionó para mí, entonces, ¿dónde es lo que finalmente terminé usando …

    Da como resultado el valor más bajo, por supuesto, puede optar por enviar @id desde el nodo con el valor más bajo en lugar de elegir.

           

    Lo mismo para el valor máximo:

           

    Prueba esto:

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

    Quizás esto funcione en XPath 1.0.

    Sé que esto tiene cinco años. Solo agrego algunas opciones más para quien pueda buscar y encontrar esto.

    Algo similar a esto funcionó para mí en XSLT 2.0.

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

    The !='' Era para evitar un valor nulo que generara valores de NaN (probablemente haya una mejor manera de hacerlo)

    Aquí hay un xpath / xquery en funcionamiento:

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