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