在XSL文档中添加外部图形的相对路径?

时间:2010-02-17 17:01:45

标签: xml xslt xsl-fo dita

首先,我对XSL知之甚少。

我正在使用名为DITA的应用来生成pdfs。它需要的一件事是覆盖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)”,但都没有用。

我做错了什么?

5 个答案:

答案 0 :(得分:3)

这是一个老问题,但在使用DITA-OT时常常被误解 重要的是要知道外部图形路径是相对于DITA-OT artwork.dir。

我可以想到两种方法来添加徽标。

简单方法

将logo.png复制到arwork diretory

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的保存位置。

艺术品目的地

定义相对于图稿根目录存储文件的路径

<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相关。

答案 1 :(得分:1)

我有一个类似的问题,并在另一个论坛中发现问题是分配“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;
   }

问候! 加布里埃尔。

答案 2 :(得分:0)

我会说你认为自己所处的位置与处理引擎认为的位置之间存在冲突。绝对路径始终有效。尝试验证“当前”位置,您将看到正在发生的事情。

答案 3 :(得分:0)

路径相对于XML文档的位置,而不是样式表的位置。

答案 4 :(得分:0)

在引用任何外部资源之前,您需要设置baseDirThis帖子可以为您提供帮助。