XSL - Duda sobre namespaces

 
Vista:

Duda sobre namespaces

Publicado por María (2 intervenciones) el 29/08/2007 11:59:07
Hola,

Estoy trabajando con una hoja de transformación cuya declaración inicial es esta:

-----------------------------------------------------------------------------------------------
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl"
version="1.0">
------------------------------------------------------------------------------------------------

Dentro de la hoja de transformación he de generar una variable cuyo conenido es una estructura xml:

<xsl:variable name="stylesheet-tree">
<stylesheet href="{$document-name}">
<xsl:apply-templates select="/" mode="tree-building"/>
</stylesheet>
</xsl:variable>

Cuando he de trabajar con esta variable tengo que utilizar la función "node-set" pero no me funciona como debería a no ser que quite uno de los namespaces:

xmlns="http://www.w3.org/1999/xhtml"

Sin este namespaces me funciona, pero claro al quitarlo el html generado ya no me pasa una validación estricta que es la que requiero.

¿Hay alguna incompatibilidad entre el namespace xmlns y xmlns:msxsl?
¿Se está sobreescribiendo algo?

Si me podeis echar una mano estaría muy agradecida.

Un saludo
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

Problema con el uso de namespaces y la función "node-set()"

Publicado por Alejandro (227 intervenciones) el 06/07/2023 16:48:01
El problema que estás experimentando se debe a una incompatibilidad entre el namespace predeterminado (`xmlns="http://www.w3.org/1999/xhtml"`) y la función `node-set()` en ciertos procesadores XSLT.

Cuando utilizas la función `node-set()` en XSLT 1.0 para convertir una variable en un conjunto de nodos, algunos procesadores no manejan adecuadamente los namespaces predeterminados, lo que puede causar problemas al trabajar con la estructura XML generada.

Para solucionar este problema, puedes intentar lo siguiente:

1. Asegúrate de que tu procesador XSLT admite la función `exslt:node-set()`. Esta función es una extensión de la biblioteca EXSLT que proporciona una forma más confiable de convertir variables en conjuntos de nodos. Para utilizarla, debes agregar el siguiente namespace a tu hoja de transformación:

1
xmlns:exslt="http://exslt.org/common"

2. Reemplaza la función `node-set()` con `exslt:node-set()` en tu código:

1
2
3
4
5
6
7
<xsl:variable name="stylesheet-tree">
  <stylesheet href="{$document-name}">
    <xsl:apply-templates select="/" mode="tree-building"/>
  </stylesheet>
</xsl:variable>
 
<xsl:variable name="converted-tree" select="exslt:node-set($stylesheet-tree)" />

Al utilizar `exslt:node-set()`, deberías evitar el conflicto con el namespace predeterminado y permitir que la conversión de la variable en un conjunto de nodos se realice correctamente.

Ten en cuenta que para utilizar `exslt:node-set()`, tu procesador XSLT debe admitir la biblioteca EXSLT y tenerla habilitada.

Espero que esta solución te ayude a solucionar el problema de incompatibilidad entre los namespaces y la función `node-set()`.
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