Относительный путь для xsl: import или xsl: include - PullRequest
6 голосов
/ 27 сентября 2008

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

1 голос
/ 23 января 2009

Я бы решил эту проблему, запустив Sysinternals Process Monitor . Запустив этот инструмент, вы можете увидеть, какие файлы пытается открыть ваш скрипт, даже если они не существуют.

1 голос
/ 03 октября 2008

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

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

... с косой чертой?

1 голос
/ 27 сентября 2008

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

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

0 голосов
/ 22 декабря 2009

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

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

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

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

0 голосов
/ 13 октября 2008

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

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

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

 <xsl:import href="{/root/@approot}/somedir/script.xsl"/>
0 голосов
/ 13 октября 2008

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

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

0 голосов
/ 27 сентября 2008

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

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