Добавление относительного пути для внешнего графического изображения в документе XSL?

StackOverflow https://stackoverflow.com/questions/2282692

  •  21-09-2019
  •  | 
  •  

Вопрос

во-первых, я мало что знаю о XSL.

Я использую приложение под названием DITA для создания PDF-файлов.Одна из вещей, которые для этого требуются, - это перезапись xsl-файла;чтобы добавить пользовательский стиль.

Я пытаюсь добавить внешнюю графику, используя относительный путь.Это не сработает, если я не укажу полный путь.

Не работает:

<fo:block text-align="center" width="100%">
  <fo:external-graphic src="../../images/logo.png"/>
</fo:block>

Действительно работает:

<fo:block text-align="center" width="100%">
  <fo:external-graphic src="/absolute/path/to/images/logo.png"/>
</fo:block>

Я посмотрел в Интернете, там было сказано использовать "file:image.png", а на другом веб-сайте было сказано использовать "url (image.png)", но ни то, ни другое не сработало.

Что я делаю не так?

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

Решение

Это старый вопрос, но его часто неправильно понимают при работе с DITA-OT.
Важно знать, что внешний графический путь относится к DITA-OT artwork.dir.

Я могу придумать два способа добавить логотип.

Самый простой способ

Скопируйте logo.png в директорию arwork

DITA-OT/demo/fo/cfg/common/artwork/logo.png

Измените свой графический путь xsl на

<fo:block text-align="center" width="100%">
  <fo:external-graphic src="Configuration/OpenTopic/cfg/common/artwork/logo.png"/>
</fo:block>

Более трудный путь

Можно изменить каталог иллюстраций, из которого DITA берет свои снимки, а также выходной каталог, который будет использоваться FOP для рендеринга PDF.

открыть файл build.xml

DITA-OT/demo/fo/build.xml

Корень художественного произведения

Определите корневой каталог, в который DITA должна скопировать обложку По умолчанию

<property name="artwork.dir" value="${dita.map.output.dir}"/>

Который установит корневой каталог, в котором будет сохранен ваш окончательный PDF-файл.

Место назначения художественного произведения

Определите путь, по которому должны храниться файлы относительно корневого каталога artwork

<copy todir="${coreArtworkDestinationDir}/Configuration/OpenTopic"

По умолчанию он создаст папки /Configuration/OpenTopic а затем скопируйте туда все, включая подкаталоги.
Обязательно дважды измените пункт назначения.Два места, которые вам нужно отредактировать, разделяют всего несколько строк.

Источник художественного произведения

Определите, где сохраняется исходное художественное оформление, чтобы DITA-OT могла скопировать файлы в место назначения.
Первая строка указывает на оформление по умолчанию, которое поставляется с DITA-OT и не должно быть изменено.

<fileset dir="${basedir}" includes="cfg/common/artwork/**/*.*"/>

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

<fileset dir="${customization.dir}" includes="common/artwork/**/*.*"/>

Путь указан относительно DITA-OT/demo/fo/Customization.

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

У меня была похожая проблема, и я обнаружил на другом форуме, что проблема заключается в форме для назначения пути "baseDir", потому что путь baseDir должен иметь префикс "file:".

Вот метод на C # для создания PDF-файла с изображениями:

   private string CreatePDF(string fileToCreate, string templateFile)
   {
       org.apache.fop.configuration.Configuration.put("baseDir", "file:" + AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["ImagesPath"] + @"\");

       //Load the style sheet.
       XslCompiledTransform xslt = new XslCompiledTransform();
       xslt.Load(templateFile);

       //Execute the transform and output the results to a file.
       xslt.Transform(fileToCreate, "temp.fo");

       FileInputStream streamFO = new FileInputStream("temp.fo");
       InputSource src = new InputSource(streamFO);

       string pdfFilesPath = ConfigurationManager.AppSettings["PDFFilesPath"];
       if (!Directory.Exists(pdfFilesPath))
       {
           Directory.CreateDirectory(pdfFilesPath);
       }

       pdfFilesPath = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["PDFFilesPath"];

       string fileName = fileToCreate.Substring(fileToCreate.LastIndexOf(@"\") + 1, fileToCreate.LastIndexOf(".") - 1 - fileToCreate.LastIndexOf(@"\")) + ".PDF";
       FileOutputStream streamOut = new FileOutputStream(pdfFilesPath + @"\" + fileName);
       Driver driver = new Driver(src, streamOut);

       driver.setRenderer(1);
       driver.run();
       streamOut.close();

       return fileName;
   }

С уважением!Габриэль.

Я бы сказал, что у вас есть конфликт между тем, где, по вашему мнению, вы находитесь, и тем, где, по мнению процессора, он находится.Абсолютные пути всегда работают.Попробуйте подтвердить "текущее" местоположение, и вы увидите, что происходит.

Путь указан относительно расположения XML-документа, а не расположения таблицы стилей.

Вам нужно установить baseDir прежде чем ссылаться на какой-либо внешний ресурс. Это post может помочь вам в этом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top