2016-12-06 4 views
1

С XSL-FO я хочу опубликовать динамические ссылки на файл PDF. Я нашел здесь на StackOverflow и с Google много примеров со статическим url, но нет примера с динамическим url. Вот почему я отправляю этот вопрос. Я хочу, чтобы создать ссылку из файла XML (ссылка значение атрибута «HREF» в «topicref» элемента):Публикация динамической ссылки в PDF-файле из XML-файла с помощью XSL-FO (Apache FOP)

<?xml version="1.0" encoding="utf-8"?> 
<map outputclass="DTVMap"> 
<title>Testdocument DTVmap</title> 
<topicref format="dita" scope="local" href="ObjSt/bla/DTV/Testdocument_14.06.dita" navtitle="Testdocument 14.06" /> 
</map> 

я использовал в XSL-FO:

<fo:basic-link external-destination="url(<xsl:value-of select="map/topicref/@href"/>)" color="blue" text- 
decoration="underline"><xsl:value-of select="map/topicref/@href"/></fo:basic-link> 

И получаю сообщение, что: «Значение атрибута« external-destination », связанное с типом элемента« null », не должно содержать символ« < ».

Я попытался получить ссылку с добавлением кода ниже в xsl-fo вместо «базового-внешнего-назначения» сверху.

<xsl:value-of select="map/topicref/@href"/> 
<xsl:param name="link" select="map/topicref/@href" /> 
<fo:basic-link color="blue" text-decoration="underline"> 
<xsl:attribute name="external-destination"> 
<xsl:value-of select="$link" /> 
</xsl:attribute> 
<xsl:value-of select="$link" /> 
</fo:basic-link> 

Существует связь в генерируемый PDF сейчас, но ссылка: «Файл: ///C/ws/fo_xslt/ObjSt/bla/DTV/Testdocument_14.06.dita» в смену: 'ObjSt/л/DTV/Testdocument_14.06.dita.

Вопрос в том, как я могу получить ссылку вроде: 'ObjSt/bla/DTV/Testdocument 14.06.dita' так, без 'файла: /// C/ws/fo_xslt'? 'C:/ws/fo_xslt' - это каталог, в который я помещал сгенерированный PDF-файл. Или: Как я могу получить ссылку, которая содержит только значение атрибута href? Благодаря

PS: Класс Java я использую для того, чтобы сгенерировать PDF это (просто чтобы дать немного больше фона):

package foXslt; 

import java.io.File; 
import java.io.IOException; 
import java.io.OutputStream; 

import javax.xml.transform.Result; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.sax.SAXResult; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

import org.apache.fop.apps.*; 

public class FopPdf { 

    public static void main(String[] args) { 
    FopPdf fOPPdfDemo = new FopPdf(); 
     try { 
      fOPPdfDemo.convertToPDF(); 
     } catch (FOPException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TransformerException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


    /** 
    * Method that will convert the given XML to PDF 
    * @throws IOException 
    * @throws FOPException 
    * @throws TransformerException 
    */ 
    public void convertToPDF() throws IOException, FOPException, TransformerException { 
     // the XSL FO file 
     File xsltFile = new File("C:\\ws\\fo_xslt\\foxslt.xsl"); 
     // the XML file which provides the input 
     StreamSource xmlSource = new StreamSource(new File("C:\\ws\\fo_xslt\\xmlDTVMapMetLink.xml")); 
     // create an instance of fop factory 
     FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI()); 
     // a user agent is needed for transformation 
     FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
     // Setup output 
     OutputStream out; 
     out = new java.io.FileOutputStream("C:\\ws\\fo_xslt\\foxslt.pdf"); 

     try { 
      // Construct fop with desired output format 
      Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out); 

      // Setup XSLT 
      TransformerFactory factory = TransformerFactory.newInstance(); 
      Transformer transformer = factory.newTransformer(new StreamSource(xsltFile)); 

      // Resulting SAX events (the generated FO) must be piped through to FOP 
      Result res = new SAXResult(fop.getDefaultHandler()); 

      // Start XSLT transformation and FOP processing 
      // That's where the XML is first transformed to XSL-FO and then 
      // PDF is created 
      transformer.transform(xmlSource, res); 
     } finally { 
      out.close(); 
     } 
    } 
+0

Как вы подтвердили, что сгенерированная ссылка «file: ///C/ws/fo_xslt/ObjSt/bla/DTV/Testdocument_14.06.dita»? Результат отображения Adobe Reader? Я думаю, что Reader обычно распознает относительный путь, основанный на существующей папке PDF. – tmakita

+0

'ObjSt/bla/DTV/Testdocument 14.06.dita' - относительная запись пути. Какой абсолютный путь вы хотите создать из этого? – tmakita

ответ

1

простым способом было бы использовать шаблон значения атрибута. Используйте { и } вокруг выражения, которые вы хотите оценить:

<fo:basic-link external-destination="url({map/topicref/@href})" 
    color="blue" text-decoration="underline"> 
    <xsl:value-of select="map/topicref/@href"/> 
</fo:basic-link> 

См https://www.w3.org/TR/xslt#attribute-value-templates для XSLT 1.0 определения.

+0

Привет, Тони, спасибо за ваш ответ. Тем не менее, он по-прежнему дает ссылку в формате pdf для: 'file: /// C/ws/fo_xslt/ObjSt/bla/DTV/Testdocument 14.06.dita'. – Jeroen83a

+0

Используйте 'external-destination = 'url ({substring-after (map/topicref/@ href,' file: /// C/ws/fo_xslt/')})" ' –

+0

Вы можете попробовать исключить' url (' и ')', чтобы определить, вызывает ли это FOP абсолютный URI. –

Смежные вопросы