Использование импорта XSL для поиска относительных путей к файлам в Windows - PullRequest
3 голосов
/ 20 сентября 2009

У меня есть простой XSL-файл, который выглядит так:

<?xml version='1.0'?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:import href="html/docbook.xsl"/> 

</xsl:stylesheet>  

У меня есть XSL-файл, который находится в папке на диске (а не в Интернете). Это путь относительно моего XSL-файла (выше):

..\..\..\Dependencies\XSL\xsl\htmlhelp\htmlhelp.xsl

<xsl:import href="..\..\..\Dependencies\XSL\xsl\htmlhelp\htmlhelp.xsl"/> 

или

<xsl:import href="../../../Dependencies/XSL/xsl/htmlhelp/htmlhelp.xsl"/> 

, похоже, не работает (получаю - не могу найти файл - ошибки из инструмента xslproc.)

Как правильно записать относительные пути в XSL: import?

Заранее спасибо,

Пол

Ответы [ 4 ]

5 голосов
/ 20 сентября 2009

Было бы полезно, если бы вы описали, как вы пытаетесь запустить свои таблицы стилей.

Одна распространенная проблема с относительными путями для включения / импорта в Java: Когда вы загружаете XSLT как StreamSource и не устанавливаете SystemID , процессор не знает, «где» находится XSLT, и не может разрешить относительные пути.

http://www.onjava.com/pub/a/onjava/excerpt/java_xslt_ch5/index.html?page=5

Предоставляя системный идентификатор как Параметр StreamSource, вы говоря процессору XSLT, где ищите commonFooter.xslt. Без этот параметр, вы можете столкнуться с ошибка, когда процессор не может разрешить этот URI. Простое решение заключается в вызвать метод setSystemId () как следующим образом:

// construct a Source that reads from an InputStream
Source mySrc = new StreamSource(anInputStream);
// specify a system ID (a String) so the 
// Source can resolve relative URLs
// that are encountered in XSLT stylesheets
mySrc.setSystemId(aSystemId);

Еще одна вещь, требующая двойной проверки, заключается в том, что ваши относительные пути действительно верны. Найдите, где находится ваш XSLT в командной строке, и перейдите на этот относительный путь, чтобы узнать, найдет ли он файл.

3 голосов
/ 20 сентября 2009

Чтобы быть уверенным, используются символы передней косой черты, т.е.

<xsl:import href="..\..\..\Dependencies\XSL\xsl\htmlhelp\htmlhelp.xsl"/>

явно неверно, не нужно следовать этой дорожке.

Возможно, проблема в том, что «Базовый URI» (как определено в RFC 2396) не соответствует нашим ожиданиям. Хотя я полагаю, что в стандарте явно изложены правила, относящиеся к определению базового URI, существует некоторая неоднозначность с различными процессорами xslt.

Если вы используете XSLT 2.0, вы можете попробовать использовать fn: base-uri (), чтобы убедиться, что этот URI действительно тот, который вы ожидаете.

1 голос
/ 20 сентября 2009

Я протестировал простой импорт таблиц стилей, используя ваш относительный путь и xsltproc. Это сработало для меня - поэтому ваш относительный путь должен быть неправильным.

0 голосов
/ 21 сентября 2009

Используйте xsltproc --stringparam baseURI file: ///path/to/your/stylesheet.xsl -o result.xml stylesheet.xsl input.xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...