вызов функции xslt document () с относительным путем в coldfusion 8 - PullRequest
1 голос
/ 17 октября 2011

В таблице стилей XSL я пытаюсь использовать функцию document () с относительным путем к файлу XML (что должно быть возможно, если я правильно понимаю спецификации XSLT), но по какой-то причине это не кажется загрузить файл. Тот же код, использующий абсолютный URI, работает как положено. Файл XML, который я пытаюсь загрузить, находится в той же папке, что и таблица стилей.

Вопрос в том, упускаю ли я что-то в отношении того, как функция document () в синтаксическом анализаторе Coldfusion 8 XSLT разрешает относительные пути? Я использую XmlTransform для вызова синтаксического анализатора XSLT в моем компоненте CF.

Структура папок (упрощенная, docroot = домен, например, http://www.example.com/):

docroot/html/xsl/stylesheet.xsl 
docroot/html/xsl/translations.xml
docroot/backend.cfc

XSLT, вызывающий функцию документа:

<h1>We should have hello after this text</h1>

<xsl:for-each select="document('translations.xml')">
    <h2>hello</h2>
</xsl:for-each>

<h1>We should have hello before this text</h1>

В приведенном выше коде, если я заменю document('translation.xml') на document('http://www.example.com/html/xsl/translation.xml'), код будет работать как положено. Однако я бы хотел избежать жесткого кодирования домена в операторе, поскольку он делает таблицу стилей менее переносимой.

XML, который я пытаюсь загрузить:

<?xml version="1.0" encoding="utf-8"?>
<translations>
    <fi>
        <insured>Vakuutettu</insured>
    </fi>
    <se>
        <insured>Försäkrad</insured>
    </se>
</translations>

Код в компоненте ColdFusion backend.cfc, который запускает синтаксический анализатор XSL:

...
<cfoutput>#XmlTransform(obj, xsltProductTable04, xslParameters)#</cfoutput>
...

xsltProductTable04 - это переменная, которая указывает на загружаемую таблицу стилей, и имеет значение html/xsl/stylesheet.xsl. Может ли иметь значение, что я загружаю таблицу стилей, используя URI относительно компонента cfc?

Обновление

По предложению Димитра Новатчева я пытался поэтапно удалять все разделы URL (например, /html/xsl/translation.xml, /xsl/translation.xml и т. Д.), Но ни одна из комбинаций не работает. Даже пробовал альтернативно с и без косой черты в начале URL.

Обновление 2

Мой текущий способ решения этой проблемы - создать абсолютный URL-адрес вне таблицы стилей, а затем передать его в качестве аргумента в таблицу стилей. Это работает, и в моем текущем проекте действительно оказывается лучшее решение, потому что оно позволяет мне упростить XSL, поскольку мне больше не нужно заботиться о выборе правильного языка внутри XSL. Но это все еще только обход оригинальной проблемы. Если у кого-то есть дополнительная информация о том, почему CF ведет себя так, как он, то я буду рад это услышать.

1 Ответ

3 голосов
/ 29 октября 2011

Я не так много сделал с XSLT или xmlTransform (), но я прочитал документы , в которых говорится:

Если код XSLT содержит операторы include с относительными путями, ColdFusion разрешает их относительно местоположения файла XSLT или для строки XSL - местоположения текущей страницы ColdFusion.

И я проверил оба из них, и они отлично работают. Похоже, ваша проблема в том, что вы передаете XSL в виде строки в xmlTransform (), поэтому, когда процессор XSLT видит ссылку на «translations.xml», он должен смотреть на него относительно к вызывающему коду, а не по отношению к исходному XML-файлу (который, насколько он знает, мог быть где угодно: в конце концов, все, что он получил, было строкой).

Так что я могу заставить ваш код работать, сделав один из двух модов:

Сначала можно передать файл PATH, например:

XmlTransform(obj, expandPath("xsl/stylesheet.xsl"), xslParameters)

Таким образом, вызов xmlTransform () знает, где находится файл XSL, и знает, как определить пути относительно самого файла XSL.

Или, во-вторых, сделайте ссылку на translations.xml в XSL-файле относительно кода , а не XSL-файла, например:

<xsl:for-each select="document('xsl/translations.xml')">

Оба эти подхода работают для меня. Я думаю, что первый из них более транспортабелен.

Имеет смысл?

...