XSL - plantilla xsl xml no valido

 
Vista:

plantilla xsl xml no valido

Publicado por carlos (1 intervención) el 05/06/2006 15:08:00
Como podría hacer lo siguiente:

En un xml tal como el siguiente
<libro><tomo><portada></portada></tomo></libro>

Necesito crear una plantilla que por cada portada haga </tomo><portada></portada><tomo>
En este proceso me sale un xml no valido pero al resolver el libro entero si resulta un xml valido
He probado ha pasar </tomo> como cdata pero cambia el símbolo < por su correspondiente entity y en el siguiente proceso me da error
El caso en cuestión es bastante mas complicado pero lo que real mente necesito es que dada una condición me cierre un elemento y cuando resuelva cierre el elemento
muchas gracias
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
Imágen de perfil de Alejandro

Crear una plantilla para cerrar y abrir elementos condicionalmente

Publicado por Alejandro (227 intervenciones) el 05/07/2023 21:54:43
Para crear una plantilla en XSL que cierre un elemento y luego lo vuelva a abrir, puedes utilizar la función `xsl:choose` junto con `xsl:when` y `xsl:otherwise` para evaluar la condición y generar la salida deseada.

Aquí tienes un ejemplo de cómo puedes hacerlo para tu caso:

1
2
3
4
5
6
7
8
9
10
<xsl:template match="portada">
  <xsl:choose>
    <xsl:when test="preceding-sibling::portada">
      </tomo><portada></portada><tomo>
    </xsl:when>
    <xsl:otherwise>
      <portada></portada>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

En este ejemplo, la plantilla se aplica a los elementos `<portada>`. Dentro de `xsl:choose`, se evalúa si existe algún elemento `<portada>` anterior (`preceding-sibling::portada`). Si es así, se genera la secuencia `</tomo><portada></portada><tomo>`. Si no hay elementos `<portada>` anteriores, se genera simplemente `<portada></portada>`.

Ten en cuenta que esta solución se basa en la asunción de que los elementos `<portada>` se encuentran en el mismo nivel y no están anidados en una estructura más compleja. Si tu XML tiene una estructura más compleja, es posible que necesites ajustar el camino de selección (`preceding-sibling::`) para adaptarlo a tu estructura.

Recuerda también que el resultado de aplicar esta plantilla a tu XML inicial no será un XML válido debido a la apertura y cierre parcial de elementos. Sin embargo, si aplicas esta plantilla a un contexto más amplio, como el elemento `<libro>` completo, el resultado final será un XML válido.

Espero que esta solución te sea útil para cerrar y abrir elementos en función de una condición. ¡Buena suerte!
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