Относительный путь для xsl:import или xsl:include
Я пытаюсь использовать VBScript для преобразования XSLT в объекте XML.
Файл XSL, который я перевожу, включает <xsl:import href="script.xsl"/>
директивы. Если я использую абсолютный URL (http://localhost/mysite/script.xsl
), он хорошо импортирует таблицу стилей; однако, если я использую относительный путь (script.xsl
) сообщает "ресурс не найден". Мне нужно иметь возможность портировать это между набором машин, поэтому мне нужно иметь возможность использовать относительный URI. Какие-либо предложения?
Заметки:
- VBScript файл находится на
http://localhost/myscript.asp
- первый XSL-файл находится в
http://localhost/mysite/styles.xsl
- Второй файл XSL находится в
http://localhost/mysite/script.xsl
- используя относительный путь
mysite/script.xsl
тоже не работает
Приложение:
Спасибо всем за ваши ответы. Чем больше я копаюсь в коде, который делает это, тем более странным он является. myscript.asp
довольно необычная компиляция кода. Что происходит styles.xsl
включен в вывод HTML myscript.asp
как кусок XML (<xml src=...>
), а затем этот чанк загружается в виде таблицы стилей с использованием VBScript на стороне клиента. Эта таблица стилей затем используется для преобразования фрагмента XML, который извлекается через XMLHTTP. Так что проблема в контексте styles.xsl
это HTML на стороне клиента и не имеет никакого отношения к где script.xsl
является.
7 ответов
Первая попытка:
Я попытался включить script.xsl в качестве еще одного фрагмента xml и изменить оператор импорта всеми возможными способами, но безуспешно.
Окончательное решение:
Поскольку абсолютный URL для включения script.xsl работал с самого начала, моим окончательным решением было преобразование style.xsl в style.asp с правильным типом документа. В этом файле я смог получить имя сервера, протокол и путь и отобразить их в нужном месте в операторе импорта с помощью asp. Затем, когда этот файл был включен в mysscript.asp, у него был правильный абсолютный URL для сервера. Это что-то вроде хака, но я нашел единственный способ решить эту довольно запутанную ситуацию.
Я бы занялся этим, запустив Sysinternals Process Monitor. Запустив этот инструмент, вы можете увидеть, какие файлы пытается открыть ваш скрипт, даже если они не существуют.
@ Джон, я думаю, ты очень близко... но не должно ли это быть...
<xsl:import href="/mysite/script.xsl"/>
... с косой чертой?
Текущий каталог для xsl:import, xsl:include и функции document() - это каталог, содержащий преобразование, которое их использует. Так что директива xsl: import, которую вы сказали, что используете, должна работать.
Единственное, о чем я могу подумать, это может повлиять на это: если вы используете относительный путь, файл читается непосредственно из файловой системы, а если вы используете абсолютный URI, он извлекается с веб-сервера. Возможно ли, что есть какой-то параметр безопасности, который не позволяет сценариям читать файлы в этом каталоге?
Я часто сталкиваюсь с этой проблемой, потому что есть библиотека, использующая пользовательский распознаватель URI, которую я не вижу (или не знаю, потому что я не читал соответствующую документацию). Я не могу вспомнить, является ли это спецификацией или но не в мире саксонцев /java, пользовательский распознаватель URI сначала пытается решить URI для операторов include/import, а также для функции document(). Если он не может разрешить URI, то средство разрешения URI по умолчанию дает ему попытку, которая обычно никогда не пропускается, когда тогда URI является абсолютным.
Так что, вероятно, что-то в движке ASP использует контекстно-управляемый преобразователь URI, основанный на контексте приложения.
Возможно ли, что "текущий каталог" для целей относительного пути может быть расположением вашей страницы ASP, а не файла XSL? Другими словами, если вы еще этого не сделали, вы можете попробовать:
<xsl:import href="mysite/script.xsl"/>
Вам нужна переменная, которая определяет подход или webroot при загрузке файлов JS, Image или CSS.
<xsl:import href="{$approot}/somedir/script.xsl"/>
или если у вас есть значение в XML,
<xsl:import href="{/root/@approot}/somedir/script.xsl"/>