Вопрос

Я пытаюсь использовать 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 есть.

Это было полезно?

Решение 6

Первая попытка:

Я попытался включить script.xsl в качестве другого фрагмента xml и изменить инструкцию import всеми возможными способами, которые я мог себе представить, но безуспешно.

Окончательное решение:

Поскольку абсолютный URL-адрес для включения script.xsl работал с самого начала, моим окончательным решением было преобразовать style.xsl в style.asp с правильным типом документа.Затем в этом файле я смог получить имя сервера, протокол и путь и отобразить их в нужном месте в инструкции import, используя asp.Затем, когда этот файл был включен в mysscript.asp, у него был правильный абсолютный URL для сервера.Это небольшой взлом, но единственный способ, который я нашел, чтобы решить эту довольно запутанную ситуацию.

Другие советы

Текущий каталог для xsl:import, xsl:include и функции document() - это каталог, содержащий преобразование, которое их использует.Таким образом, директива xsl: import, которую, по вашим словам, вы используете, должна работать.

Единственное, что я могу придумать, что может повлиять на это:если вы используете относительный путь, файл считывается непосредственно из файловой системы, в то время как если вы используете абсолютный URI, он извлекается с веб-сервера.Возможно ли, что существует какой-то параметр безопасности, который запрещает скриптам читать файлы в этом каталоге?

@Джон, я думаю, вы очень близки...но разве так не должно быть?..

<xsl:import href="/mysite/script.xsl"/>

...с косой чертой в начале?

Я бы решил это, запустив Системный Внутренний монитор процессов.Когда этот инструмент запущен, вы действительно можете видеть, какие файлы пытается открыть ваш скрипт, даже если они не существуют.

Возможно ли, что "текущий каталог" для целей относительного пути может быть местоположением вашей страницы ASP, а не вашего XSL-файла?Другими словами, если вы еще этого не сделали, вы могли бы попробовать:

<xsl:import href="mysite/script.xsl"/>

Я часто сталкиваюсь с этой проблемой, потому что библиотека, которую я не вижу (или о которой не знаю, потому что не читал соответствующую документацию), использует пользовательский распознаватель URI.) Я не могу вспомнить, является ли это спецификацией или нет, но в мире Saxon / java пользовательский распознаватель URI впервые пытается разрешить URI для операторов include / import, а также функции document ().Если он не может разрешить URI, распознаватель URI по умолчанию дает ему попробовать, который обычно никогда не пропускает, когда URI является абсолютным.

Таким образом, вероятно, что-то в движке ASP использует контекстно-ориентированный распознаватель URI на основе контекста приложения.

Вам нужна переменная, которая определяет approot или webroot при загрузке файлов JS, Изображений или CSS.

 <xsl:import href="{$approot}/somedir/script.xsl"/>

или, если у вас есть значение в XML,

 <xsl:import href="{/root/@approot}/somedir/script.xsl"/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top