2009-03-10 6 views
7

La verificación del espacio de nombres está deshabilitada en el servidor que maneja las transformaciones XSL (porque el tipo que escribió el XSL no entendía los espacios de nombres). Tengo que hacer cambios en el XSL pero no puedo probarlo porque no hay espacios de nombres definidos, es decir.¿Hay alguna manera de ignorar los espacios de nombres durante una transformación XSL?

En lugar de

<xsl:template match="ns:element[position()=1]">... 

tiene

<xsl:template match="element[position()=1]">... 

por lo que no coincide con ninguno de los elementos en el XML, porque todos ellos son todos calificados con espacios de nombres.

No puedo probar en el servidor porque no tengo acceso a él. No sirve de nada arreglar el XSL porque la verificación del espacio de nombres deberá estar habilitada, y eso romperá todas las demás transformaciones.

Entonces, lo que tengo que hacer es encontrar una forma de ignorar los espacios de nombres durante una transformación XSL. Tengo acceso a MSXML, XMLSpy (no puedo encontrar una opción aquí) y si realmente necesito puedo codificar algo en C# o en un lenguaje similar.

Como último recurso que pueda codificar hasta unas pocas expresiones regulares pero realmente no quiero ir por ese camino, sobre todo cuando se trata de XML ...

En respuesta a un comentario acerca de más detalles:

Es un servidor virtual de Windows 2003, ejecutando una instancia de un Servlet de Methode (www.eidosmedia.com). No sé qué técnica utiliza este servlet para realizar transformaciones XSL. Están ignorando los espacios de nombres porque la persona que originalmente escribió el XSL no los entendía y no los incluyó en el XSL. Entonces, ahora todos los archivos XSL (cientos) no tienen espacios de nombres.

Podría ser un reto interesante para arreglar todos estos archivos de una sola vez, pero eso no es lo que necesito ahora (y el jefe de departamento no estaría de acuerdo en que de todos modos, debido a la cantidad de pruebas que participan). Todo lo que quiero saber es si hay una herramienta (o técnica) disponible que me permita tomar estos archivos XSL como están y usarlos para transformar un documento XML correspondiente sin tener en cuenta los espacios de nombres. Me parece que debe existir una herramienta, porque el tipo que escribió el XSL original debe haber usado algo similar para probar las transformaciones él mismo.

+0

¿Cómo se desactiva la verificación del espacio de nombres en un servidor? Nunca había oído hablar de tal cosa. –

+0

Es un producto de terceros (no Microsoft o Sun) que maneja transformaciones. Simplemente le pidieron a los desarrolladores que les dieran una opción para deshabilitarlo. – ilitirit

+0

¿Podríamos obtener más detalles? Como qué tipo de servidor, etc. Además, ¿qué problema quieren resolver ignorando los espacios de nombres? Ignorar los espacios de nombres es muy difícil, por lo que si conocemos el problema detrás del problema, podríamos tratar de abordarlo en su lugar. –

Respuesta

5

podría hacer una transformación para eliminar todos los espacios de nombres de su entrada antes de su transformación "real". Pero ... no estoy seguro si debería hacerlo. Se siente feo

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="*"> 
    <xsl:element name="{local-name()}" > 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*"> 
    <xsl:attribute name="{local-name()}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

Respuesta original:

¿Sería una opción?

<xsl:template match="*[local-name()='element' and position()=1]">... 

(como comentarios mostraron - no sería)

+0

Desafortunadamente no. Como publiqué en otro comentario, el partido fue solo un ejemplo. También hay funciones de "selección". – ilitirit

+0

Además del hecho de que se requiere algo de trabajo ... ¿Por qué no debería funcionar? Tomalak

+0

No puedo pensar en una razón por la que no debería funcionar , pero debido a la cantidad de trabajo requerido, también podría escribir expresiones regulares para eliminar/insertar espacios de nombres. Todo lo que quiero saber es si hay una herramienta que permita transformaciones sin espacios de nombres. Ya conozco otras soluciones que requieren trabajo. – ilitirit

0

¿Cuántos espacios de nombres con los que cuenta el XML que se transforma?

Si 1 puede agregar temporalmente ese espacio de nombres como el espacio de nombres predeterminado de su XSL? De acuerdo, eso significa que puede necesitar cambiar el espacio de nombre de salida, etc. pero una vez que lo haya probado, podría eliminar estos ajustes.

Si hay más de 1 implica que no hay colisiones de nombres locales en los espacios de nombres. ¿Podría modificar el XML de entrada de prueba para que todos los alias apunten al mismo espacio de nombres y luego realizar el ajuste anterior?

+0

He contado al menos 10 espacios de nombres (es un archivo SpreadsheetML). Ya eliminé los espacios de nombres de un archivo de entrada, pero no es una buena solución porque tengo que hacerlo cada vez que pruebo un archivo nuevo. – ilitirit

+0

Ouch. :(Dudo que encuentres un procesador XSL que se respete a sí mismo y que permita lo que necesites. Lamentablemente, creo que los scripts RegEx son probablemente tu propio recurso. Guarda una dura conversación con los propietarios del servidor. – AnthonyWJones

1

Estoy publicando esto como respuesta porque es demasiado largo para caber como comentario.

Ningún procesador XSLT del que haya escuchado alguna vez le permite ignorar globalmente los espacios de nombres en el XML de entrada. Si tiene transformaciones XSL escritas ignorando los espacios de nombres y los documentos XML que las utilizan, debe utilizar el servlet roto para realizar la transformación o preprocesar los documentos XML para eliminar los espacios de nombres.

La transformación de Tomalak publicada hará eso, y a diferencia de usar expresiones regulares, lo hará sin atornillar todo lo demás en el XML. Y tampoco es mucho trabajo hacer eso. Encadenamiento de transformaciones es bastante fácil.

Cuestiones relacionadas