XSL - Filtrado de elementos repetidos

 
Vista:

Filtrado de elementos repetidos

Publicado por Ampi (2 intervenciones) el 16/02/2006 14:01:58
Hola a todos:

Hace poco que empecé a trabajar con xml/xsl y tengo una duda que no sé cómo resolver. Espero que alguien me pueda ayudar.

Tengo el siguiente xml:

<producto>
<codigo>123</codigo>
<descripcion>
<cadena lenguaje="es"> Descripcion en Español </cadena>
<cadena lenguaje="en"> Descripcion en Ingles </cadena>
</descripcion>
</producto>

-------

Lo que quiero hacer es mostrar la descripcion del producto. Si estoy en la versión española de mi aplicación, selecciono que muestre la descripción en español:

<xsl:if test="descripcion/cadena/@lenguaje='es' ">
<xsl:value-of select="."/>
</xsl:if>

Cuando ejecuto la versión en inglés de mi aplicación, quiero que muestre la descripción en inglés, y en caso de no existir, la de español, pero si hago esto:

<xsl:for-each select="descripcion/cadena">
<xsl:choose>
<xsl:when test="@lenguaje='en' ">
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>

... falla en el momento en el que tengo ambas descripciones. Si solo tengo la de español y no hay inglesa, no hay problema, me escribe la española, pero si tengo las dos, al encontrarse dos veces con cadena, siempre se me cumple o una condicion o la otra.

¿Qué puedo hacer para que en caso de estar las dos, solo se quede con la inglesa? He probado incluso el uso de variables, pero al ser locales no acabo de obtener el resultado que quiero.

Os agradeceria mucho que me ayudaseis.
Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Filtrado de elementos repetidos

Publicado por Rafitelli (2 intervenciones) el 11/05/2006 15:15:31
Hola Chat@

Pues veras lo que se me ocurre a mi. Puedes ver si existe la version inglesa de la descripcion de la siguiente manera:

<xsl:for-each select="descripcion">
<xsl:if test="count(./cadena[@lenguaje='en']) > 0 ">
<xsl:value-of select="./cadena[@lenguaje='en']" />
</xsl:if>
<xsl:if test="count(./cadena[@lenguaje='en']) = 0">
<xsl:value-of select="./cadena[@lenguaje='es']" />
</xsl:if>
</xsl:for-each>

Es decir: es normal lo que te pasa porque tu analizas desde dentro de la propia cadena y por eso te es imposible distinguir si existe la descripcion en un lenguaje, otro, o los dos.

Lo que yo te propongo es que te salgas fuera, al elemento padre, descripcion, y que veas cuantos nodos cadena que contengan el atributo @lenguaje con el valor 'en' tienes. si tienes mas de 0, quiere decir que la descripcion en ingles existe y entonces pillas ese valor. Si tienes 0 elementos es que la descripcion solo existe en español, y entonces pillas el valor del nodo correspondiente a @lenguaje='es'.

No se si esto resuelve tu problema o si llega a tiempo, pero bueno la intencion es lo que cuenta :)

Bye, nuevos saludos del Xslero enmascarado jajajajajajajajajajjaajaj
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar