Как разрешить элементы и с относительными путями при использовании xsltc.exe XslCompiledTransforms?

Как часть процесса сборки нашего веб-приложения, я настроил наши таблицы стилей XSLT, которые будут собираться с компилятором Microsoft xsltc.exe всякий раз, когда мы запускаем полную компиляцию. Во время локальной разработки это отлично сработало, поскольку код компилируется и размещается в одном месте.Однако, как только он был помещен на сервер сборки, возникли проблемы.

Сервер сборки компилирует таблицы стилей XSLT, как и я, локально, но затем запускается сценарий, который развертывает скомпилированный код на нашем внутреннем промежуточном веб-сервере. После того, как эти двоичные файлы были перемещены из того места, где они были скомпилированы, относительные пути в элементах и больше не разрешаются правильно, вызывая исключения, которые выглядят следующим образом при запуске таблиц стилей 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)

Вот общее представление о коде в его нынешнем виде:

var xslt = new XslCompiledTransform();
xslt.Load(typeof(Namespace.XslTransforms.CompiledXsltStylesheet));
xslt.Transform("input.xml", "output.xml");

Прямо сейчас я использую метод XslCompiledTransform.Load () с одним параметром Type, чтобы ввести предварительно скомпилированный на основе xsltc.exe Таблицы стилей XSLT. По трассировке стека я могу сказать, что платформа .NET использует XmlUrlResolver, чтобы попытаться определить фактическое расположение этих внешних таблиц стилей, но я не вижу способа предоставить переопределенную реализацию XmlResolver, где я мог бы передать новый baseUri, указывающий на расположение этих таблиц стилей на веб-сервере.

Я полагаю, что могу решить эту проблему, больше не компилируя с помощью xsltc.exe и загружая таблицы стилей XSLT через XmlReaders, поскольку это позволит мне использовать другие методы XslCompiledTransform.Load () , которые имеют параметр, в котором я мог бы предоставить свою собственную реализацию XmlResolver. Однако мне нравится опция предварительной компиляции для проверки синтаксиса и производительности, поэтому я не хочу отказываться от нее, если в этом нет крайней необходимости.

Есть ли способ использовать xsltc.exe, чтобы предварительно скомпилировать эти таблицы стилей XSLT, но все же предоставить способ явно указать baseUri для разрешения относительного пути элементов и во время выполнения. ?

5
задан Dimitre Novatchev 25 January 2012 в 03:03
поделиться