2016-12-06 12 views
1

XSL-FO를 사용하여 PDF 파일에 대한 동적 링크를 게시하고 싶습니다. StackOverflow 및 정적 URL이있는 많은 예제가 있지만 동적 URL이없는 예제는 여기에서 찾을 수 있습니다. 그것이 내가이 질문을 게시하는 이유입니다. 나는 XML 파일에서 링크를 생성 할 (링크는 속성 요소 'topicref'에서 'HREF'의 값입니다) :XSL-FO (Apache FOP)로 XML 파일에서 PDF 파일로 동적 링크 게시

<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> 
: 나는 XSL-FO에 사용

<?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> 

그리고 다음 메시지가 나타납니다. "요소 유형"null "과 연결된"external-destination "속성 값에 '<'문자가 없어야합니다."

위의 '기본 링크 외부 대상'대신 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/bla/DTV/Testdocument_14.06.dita'.

질문은; 어떻게하면 'ObjSt/bla/DTV/Testdocument 14.06.dita'와 같은 링크를 얻을 수 있습니까? 'file : /// C/ws/fo_xslt'없이? 'C :/ws/fo_xslt'는 생성 된 PDF를 저장하는 디렉토리입니다. 또는 : href 속성 값만 포함하는 링크는 어떻게 얻을 수 있습니까? 감사

PS : 나는 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> 

는 XSLT 1.0 정의 https://www.w3.org/TR/xslt#attribute-value-templates를 참조하십시오.

+0

안녕하세요, Tony, 답변 해 주셔서 감사합니다. 그러나 여전히 pdf에 'file : /// C/ws/fo_xslt/ObjSt/bla/DTV/Testdocument 14.06.dita'라는 링크가 있습니다. – Jeroen83a

+0

'external-destination = "url ({subring-after (map/topicref/@ href, 'file : /// C/ws/fo_xslt /'})")을 사용하십시오. " –

+0

' FOP가 절대 URI를 생성하는지 여부를 확인하기 위해')'를 사용한다. –