lunes, 8 de diciembre de 2008

Max y Min en XPath

Antes de que me olvide: como XPath no soporta funciones que devuelvan máximos y mínimos de manera natural, lo que debemos hacer es filtrar los nodos eliminando aquellos que tienen un nodo mayor, antes (preceding-sibling) o después (following-sibling). De esa forma podemos obtener el nodo deseado.

Ejemplo:

Con un XML que contenga...

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="max.xsl"?>
<root>
<nodo id="1">12</nodo>
<nodo id="2">17</nodo>
<nodo id="3">58</nodo>
<nodo id="4">33</nodo>
</root>

y un XSL que diga...

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="root">
root contiene <xsl:value-of select="count(node())"/> nodos.<br/>
El mayor valor es <xsl:value-of
select="nodo[not(preceding-sibling::nodo &gt; .)
and not(following-sibling::nodo &gt; .)]"/><br/>
El menor valor es <xsl:value-of
select="nodo[not(preceding-sibling::nodo &lt; .)
and not(following-sibling::nodo &lt; .)]"/><br/>
</xsl:template>
</xsl:stylesheet>

... dará como resultado...

Root contiene 4 nodos.
El mayor valor es 58
El menor valor es 12