2015-01-28 8 views
0

XML 파일에서 fo 파일을 생성하기 위해 명령 줄에서 Docbook 1.78 및 xsltproc (libxslt 1.1.26 with libxml 2.7.8)을 사용하고 있습니다. 내 목표는 Apache 형식의 출력 프로세서 (fop; 버전 1.1)를 사용하여 PDF를 생성하는 것입니다. 내 XML 입력 파일 :libxslt를 사용하는 XML에서 PDF 생성 중 ValidationException

<?xml version="1.0" encoding="iso-8859-1"?> 
<!DOCTYPE book SYSTEM "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"> 
<book lang="de" id="MyBook"> 
    <chapter id="Introduction"> 
     <title>Introduction</title> 
     <section id="sec_intro_1"> 
      <title>Test</title> 
      <para>para1_sec_intro_1 (see also glossary: <xref linkend="gloss_etm-datei"/>).</para> 
      <para>para2_sec_intro_1</para> 
     </section> 
     <section id="sec_intro_2"> 
      <title>Another Test</title> 
      <para>para1_sec_intro_2 (glossary: <xref linkend="gloss_etm-datei"/>).</para> 
      <para>para2_sec_intro2</para>  
     </section> 
    </chapter> 
    <xi:include href="glossar_test.xml" xmlns:xi="http://www.w3.org/2001/XInclude"></xi:include> 
</book> 

내가

xsltproc -o ./test.fo --xinclude --stringparam paper.type A4 --stringparam fop1.extensions 1 ./docbook/fo/docbook.xsl ./test.xml 2> fo_out.txt 

FO-파일이 생성 다음 명령을 실행하지만 FO가 포함되어있는 경우 : 고유하지 않은 ID를 가진 래퍼 요소를. 이것은 생성됩니다 FO 파일 : 나는 그 FO-파일, FOP는 예외가 발생에서 PDF 파일을 생성하려고하면

... 
(see also glossary: <fo:basic-link internal-destination="gloss_etm-datei"><fo:inline> 
      <fo:wrapper id="idp8751564240"><!--ETM-Datei--></fo:wrapper> 
      <fo:inline font-weight="bold">ETM-Datei</fo:inline> 
     </fo:inline></fo:basic-link>) 
.... 
(glossary: <fo:basic-link internal-destination="gloss_etm-datei"><fo:inline> 
      <fo:wrapper id="idp8751564240"><!--ETM-Datei--></fo:wrapper> 
      <fo:inline font-weight="bold">ETM-Datei</fo:inline> 
     </fo:inline></fo:basic-link>). 
... 

지금,

:

SEVERE: Exception 
org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: Property ID "idp8751564240" (found on "fo:wrapper") previously used; ID values must be unique within a document! (See position 6:48) 
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: Property ID "idp8751564240" (found on "fo:wrapper") previously used; ID values must be unique within a document! (See position 6:48) 
    at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:303) 
    at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130) 
    at org.apache.fop.cli.Main.startFOP(Main.java:177) 
    at org.apache.fop.cli.Main.main(Main.java:208) 
Caused by: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: Property ID "idp8751564240" (found on "fo:wrapper") previously used; ID values must be unique within a document! (See position 6:48) 
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:501) 
    at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:300) 
    ... 3 more 
Caused by: org.apache.fop.fo.ValidationException: Property ID "idp8751564240" (found on "fo:wrapper") previously used; ID values must be unique within a document! (See position 6:48) 
    at org.apache.fop.events.ValidationExceptionFactory.createException(ValidationExceptionFactory.java:38) 
    at org.apache.fop.events.EventExceptionManager.throwException(EventExceptionManager.java:58) 
    at org.apache.fop.events.DefaultEventBroadcaster$1.invoke(DefaultEventBroadcaster.java:175) 
    at com.sun.proxy.$Proxy2.idNotUnique(Unknown Source) 
    at org.apache.fop.fo.FObj.checkId(FObj.java:173) 
    at org.apache.fop.fo.FObj.startOfNode(FObj.java:154) 
    at org.apache.fop.fo.flow.Wrapper.startOfNode(Wrapper.java:65) 
    at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:325) 
    at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:175) 
    at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072) 
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) 
    at org.apache.xerces.xinclude.XIncludeHandler.startElement(Unknown Source) 
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484) 
    ... 4 more 

를 내가 여기에 뭔가 잘못을하고 있습니까? 도움을 주셔서 감사합니다. 사전에

감사합니다!

<?xml version="1.0" encoding="iso-8859-1"?> 
<!DOCTYPE glossary PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" 
     "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"> 

<glossary id="glossar"> 
    <title>Glossar</title> 
    <glossdiv id="gloss_E"> 
     <title>E</title> 
     <glossentry id="gloss_etm-datei"> 
      <glossterm id="glossterm_etm_datei"> 
       <indexterm> 
        <primary>ETM-Datei</primary> 
       </indexterm> 
       <emphasis role="bold">ETM-Datei</emphasis> 
      </glossterm> 
      <glossdef> 
       <para> 
        Glossary_Text 
       </para> 
      </glossdef> 
     </glossentry> 

    </glossdiv> 
</glossary> 
+0

ID가 'gloss_etm-datei'인 것을 포함하는'glossar_test.xml'을 표시 할 수 있습니까? 그렇지 않으면 나는 이것을 재현 할 수 없다. –

답변

0

나는 해결책을 발견했습니다

편집 여기 는 glosar_test.xml입니다! http://www.sagehill.net/docbookxsl/LinkToGlossary.html에는 근심사를 언급하는 방법이 설명되어 있습니다. 일반적으로, 당신은 또한 link 또는 xref -tag을 사용할 수 있습니다, 예컨대 :

<para>Set your <glossterm linkend="NetAddr">network address</glossterm>. 
</para> 
... 
<glossary> 
    <glossentry id="NetAddr"> 
    <glossterm>Network address</glossterm> 
    <glossdef><para>Four numbers separated by periods</para></glossdef> 
    </glossentry> 
</glossary> 

glossterm -tag를 사용합니다. 외부 참조 태그를 사용하는 경우 id 속성을 glossterm에 추가하고 일치하는 endterm 속성을 xref 요소에 추가해야합니다. 예를 들어 :

당신이 그렇다면, FO의 IDS 경우
<xref linkend="ge-xslfoprocessor" endterm="gt-xslfoprocessor"/> 
... 

<glossentry id="ge-xslfoprocessor"> 
<glossterm id="gt-xslfoprocessor">XSL-FO processor</glossterm> 
<glossdef> 
<para>Software component that converts an XSL-FO document into a 
formatted document.</para> 
</glossdef> 
</glossentry> 

: 래퍼가 제거되고 FOP는 pdf 파일로 구문 분석 할 수 있습니다.