Febrero 6, 2008
A veces tenemos la necesidad de comparar el valor del nodo actual con el valor del nodo anterior. Por ejemplo si tenemos un XML:
<?xml version="1.0" encoding="iso-8859-1"?>
<raiz>
<hijos>
<hijo>
<codigo>1</codigo>
<nombre>uno</nombre>
</hijo>
<hijo>
<codigo>1</codigo>
<nombre>uno</nombre>
</hijo>
<hijo>
<codigo>2</codigo>
<nombre>dos</nombre>
</hijo>
<hijo>
<codigo>2</codigo>
<nombre>dos</nombre>
</hijo>
<hijo>
<codigo>3</codigo>
<nombre>tres</nombre>
</hijo>
<hijo>
<codigo>3</codigo>
<nombre>tres</nombre>
</hijo>
<hijo>
<codigo>3</codigo>
<nombre>tres</nombre>
</hijo>
<hijo>
<codigo>4</codigo>
<nombre>cuatro</nombre>
</hijo>
<hijo>
<codigo>4</codigo>
<nombre>cuatro</nombre>
</hijo>
<hijo>
<codigo>4</codigo>
<nombre>cuatro</nombre>
</hijo>
<hijo>
<codigo>4</codigo>
<nombre>cuatro</nombre>
</hijo>
</hijos>
</raiz>
Tenemos nuestro XSLT que recuperara los valores diferentes del nodo hijo:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="raiz">
<html>
<body>
<xsl:for-each select="hijos/hijo">
<xsl:choose>
<xsl:when test="position()=1">
<p><xsl:value-of select="nombre"/></p>
</xsl:when>
<xsl:otherwise>
<xsl:if test="codigo!=preceding-sibling::hijo[1]/codigo">
<p><xsl:value-of select="nombre"/></p>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
EL preceding-sibling recupera todos los nodos que son anteriores al nodo actual, pero como nos interesa el anterior y adyacente por eso recuperamos el de la primera posición. Al transformar el XML con la hoja de estilo nos deberia retornar:
<html>
<body>
<p>uno</p>
<p>dos</p>
<p>tres</p>
<p>cuatro</p>
</body>
</html>
Referencia:
http://www.zvon.org/xxl/XSLTreference/Output/index.html
3 comentarios |
General | Etiquetado: preceding-sibling, xml, xsl, xslt |
Permalink
Escrito por Eduardo Sanchez Vera