regulares online herramienta expresiones ejemplos consultas attribute and xml xpath xpath-1.0

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



xpath online (6)

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 &lt; respetando &gt; .

Si tengo XML como:

<foo> <bar id="1" score="192" /> <bar id="2" score="227" /> <bar id="3" score="105" /> ... </foo>

¿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.


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.

<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 mismo para el valor máximo:

<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>


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.


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 &lt; respetando &gt; .


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))]