Là một phần của quá trình xây dựng ứng dụng web của chúng tôi, tôi đã thiết lập các bản định kiểu XSLT của chúng tôi để được xây dựng với trình biên dịch Microsoft's xsltc.exe bất cứ khi nào chúng tôi chạy một bản dịch đầy đủ. Trong quá trình phát triển địa phương, điều này đã làm việc rất tốt, vì mã được biên dịch và lưu trữ trong cùng một vị trí. Tuy nhiên, một khi điều này đã được đặt trên máy chủ xây dựng, vấn đề phát sinh.Làm cách nào để giải quyết các yếu tố <xsl:import> và <xsl:include> có đường dẫn tương đối khi sử dụng xsltc.exe XslCompiledTransforms?
Máy chủ xây dựng sẽ biên dịch biểu định kiểu XSLT giống như tôi làm cục bộ, nhưng sau đó tập lệnh chạy triển khai mã được biên dịch đến máy chủ web dàn dựng nội bộ của chúng tôi. Khi các tệp nhị phân này đã di chuyển từ nơi chúng được biên dịch, các đường dẫn tương đối trong các phần tử <xsl:import>
và <xsl:include>
không còn giải quyết chính xác nữa, khiến các ngoại lệ trông như thế này khi các bảng định kiểu XSLT được chạy.
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)
Dưới đây là một ý tưởng chung của các mã như nó đứng bây giờ:
var xslt = new XslCompiledTransform();
xslt.Load(typeof(Namespace.XslTransforms.CompiledXsltStylesheet));
xslt.Transform("input.xml", "output.xml");
Ngay bây giờ tôi đang sử dụng phương pháp XslCompiledTransform.Load() với một tham số duy nhất 'Loại' để mang lại trong các bản định kiểu XSLT được biên dịch trước dựa trên xsltc.exe. Tôi có thể nói từ dấu vết ngăn xếp rằng khuôn khổ .NET đang sử dụng XmlUrlResolver để cố gắng giải quyết vị trí thực tế của các biểu định kiểu bên ngoài này, nhưng tôi không thấy cách nào để cung cấp một triển khai ghi đè XmlResolver mà tôi có thể chuyển vào một baseUri trỏ đến nơi các bảng định kiểu này xuất hiện trên máy chủ web. Tôi giả sử tôi có thể giải quyết điều này bằng cách không còn biên dịch trước bằng xsltc.exe và tải bản định kiểu XSLT qua XmlReaders, vì điều đó sẽ cho phép tôi sử dụng other XslCompiledTransform.Load() methods có tham số nơi tôi có thể cung cấp triển khai XmlResolver của riêng mình. Tuy nhiên, tôi thích tùy chọn biên dịch trước để xác thực cú pháp và hiệu suất, vì vậy tôi không muốn từ bỏ nó trừ khi tôi hoàn toàn phải làm vậy.
Có cách nào để sử dụng xsltc.exe để pre-biên dịch các stylesheets XSLT, nhưng vẫn cung cấp một cách để nêu một cách rõ ràng baseUri cho tương độ phân giải con đường của <xsl:include>
và <xsl:import>
yếu tố trong thời gian chạy?
Các biểu định kiểu được nhập/bao gồm không được triển khai cùng với tệp nhị phân (đến 'máy chủ web phân trang nội bộ')? –
Chúng có, nhưng chúng nằm trong một thư mục khác với nơi chúng được biên dịch. – Technetium
Nếu bạn bắt chước cấu trúc thư mục của máy chủ web dàn dựng trên máy chủ xây dựng (nơi bạn đang biên dịch biểu định kiểu), điều đó có tạo nên sự khác biệt tích cực không? –