W ramach procesu kompilacji aplikacji internetowej skonfigurowałem arkusze stylów XSLT, które zostaną zbudowane przy użyciu kompilatora Microsoft's xsltc.exe, gdy uruchomimy pełną kompilację. Podczas lokalnego rozwoju działało to świetnie, ponieważ kod jest kompilowany i hostowany w tej samej lokalizacji. Jednak po umieszczeniu tego na serwerze kompilacji pojawiły się problemy.Jak rozpoznać elementy <xsl:import> i <xsl:include> ze względnymi ścieżkami podczas korzystania z xsltc.exe XslCompiledTransforms?
Serwer build będzie kompilacji stylów XSLT jak zrobić lokalnie, ale następnie uruchamia skrypt, który instaluje skompilowany kod do naszego wewnętrznego serwera testowego internetowej. Po przeniesieniu tych plików binarnych z miejsca, w którym zostały skompilowane, względne ścieżki w elementach <xsl:import>
i <xsl:include>
nie są już poprawnie rozwiązywane, powodując wyjątki, które wyglądają tak, gdy są uruchamiane arkusze stylów 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)
Oto ogólny pomysł kodu, gdyż stoi teraz:
var xslt = new XslCompiledTransform();
xslt.Load(typeof(Namespace.XslTransforms.CompiledXsltStylesheet));
xslt.Transform("input.xml", "output.xml");
Teraz używam metody XslCompiledTransform.Load() za pomocą jednego parametru „typ”, aby doprowadzić w oparte na xsltc.exe wstępnie skompilowane arkusze stylów XSLT. Mogę powiedzieć ze śledzenia stosu, że platforma .NET używa XmlUrlResolver, aby spróbować rozwiązać faktyczną lokalizację tych zewnętrznych arkuszy stylów, ale nie widzę sposobu na nadpisanie implementacji XmlResolver, w którym mógłbym przekazać nowy baseUri wskazujące, gdzie te arkusze stylów znajdują się na serwerze sieciowym.
Zakładam mogę rozwiązać ten problem nie jest już pre-kompilacji z xsltc.exe i załadowaniem arkuszy stylów XSLT poprzez XmlReaders, ponieważ pozwoli mi korzystać z other XslCompiledTransform.Load() methods które mają parametr, gdzie mogę zapewnić własną implementację XmlResolver. Jednak podoba mi się opcja wstępnej kompilacji do sprawdzania składni i wydajności, więc nie chcę rezygnować, chyba że absolutnie muszę.
Czy istnieje sposób na wykorzystanie xsltc.exe wstępnie skompilować te arkusze stylów XSLT, a jednocześnie zapewnić sposób wyraźne określenie baseUri dla rozdzielczości względnej ścieżki z <xsl:include>
i <xsl:import>
elementów w czasie wykonywania?
Czy zaimportowane/dołączone arkusze stylów nie są wdrażane razem z plikiem binarnym (do "wewnętrznego serwera sieciowego pomostowego")? –
Są, ale znajdują się w innym katalogu niż miejsce, w którym zostały skompilowane. – Technetium
Jeśli naśladujesz strukturę katalogów serwera WWW pomostowego na serwerze kompilacji (gdzie kompilujesz arkusz stylów), czy to spowoduje dodatnią różnicę? –