Como parte del proceso de compilación de nuestra aplicación web, configuré nuestras hojas de estilo XSLT para compilar con el compilador Microsoft's xsltc.exe cada vez que ejecutamos una compilación completa. Durante el desarrollo local, esto funcionó muy bien, ya que el código se compila y aloja en la misma ubicación. Sin embargo, una vez que esto se puso en el servidor de compilación, surgieron problemas.¿Cómo puedo resolver los elementos <xsl:import> y <xsl:include> con rutas relativas al usar xsltc.exe XslCompiledTransforms?
El servidor de compilación compilará las hojas de estilos XSLT tal como lo hago localmente, pero luego se ejecuta una secuencia de comandos que despliega el código compilado en nuestro servidor web de ensayo interno. Una vez que estos archivos binarios se han movido desde donde se compilaron, las rutas relativas en los elementos <xsl:import>
y <xsl:include>
ya no se resuelven correctamente, lo que provoca excepciones que se ven así cuando se ejecutan las hojas de estilo XSLT.
Could not find a part of the path 'e:\{PATH}\xslt\docbook\VERSION'.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize)
at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
at System.Xml.Xsl.Runtime.XmlQueryContext.GetDataSource(String uriRelative, String uriBase)
Aquí es una idea general del código tal como está ahora:
var xslt = new XslCompiledTransform();
xslt.Load(typeof(Namespace.XslTransforms.CompiledXsltStylesheet));
xslt.Transform("input.xml", "output.xml");
En este momento estoy usando el método XslCompiledTransform.Load() con un único parámetro 'Tipo' para que en el xsltc.exe-based pre-compiled XSLT stylesheets. Puedo deducir por el seguimiento de la pila que .NET Framework está usando XmlUrlResolver para tratar de resolver la ubicación real de estas hojas de estilo externas, pero no veo una manera de proporcionar una implementación anulada de XmlResolver donde podría pasar una nueva baseUri que apunta a dónde viven estas hojas de estilo en el servidor web.
Supongo que puedo resolver esto ya no compilando previamente con xsltc.exe y cargando las hojas de estilo XSLT a través de XmlReaders, ya que eso me permitirá usar el other XslCompiledTransform.Load() methods que tiene un parámetro donde podría proporcionar mi propia implementación de XmlResolver. Sin embargo, me gusta la opción de compilación previa para la validación de la sintaxis y el rendimiento, por lo que no quiero renunciar a ella a menos que sea absolutamente necesario.
¿Hay una manera de utilizar xsltc.exe comprobar la validez de recopilar estas hojas de estilo XSLT, y aún así proporcionar una manera de indicar explícitamente el baseURI para la resolución de la ruta relativa <xsl:include>
y <xsl:import>
elementos en tiempo de ejecución?
¿Las hojas de estilo importadas/incluidas no se implementan junto con el binario (en el "servidor web de ensayo interno")? –
Lo son, pero están en un directorio diferente de donde se compilaron. – Technetium
Si imita la estructura del directorio del servidor web de ensayo en el servidor de compilación (donde está compilando la hoja de estilo), ¿hará eso una diferencia positiva? –