2014-04-15 5 views
2

나는이 오류에 대한 해결책을 찾기 위해 하루를 보냈지 만 다른 주제가 실제로 해결되지는 않았지만 동일한 문제를 해결하는 데 거의 사용되지 않았습니다. 따라서 중복 된 질문이 있으면 미리 사과드립니다.Java에서 Apache FOP의 XSL 오류

우리는 사용자가 이미지를 저장하고 백 엔드 데이터 저장소에서 이미지를 검색 할 수있는 응용 프로그램을 보유하고 있습니다. 또한 이미지에 메타 데이터 (주석이라고 함)를 포함 할 수 있습니다. TIFF 이미지의 경우 사용자가 이미지를 검색 할 때 XML (XML)로 주석을 검색합니다. Apache FOP를 사용하여 텍스트를 테이블로 형식화 한 다음 PNG 파일로 렌더링하고 TIFF로 표시합니다.

최근까지 작동했습니다.

SXCH0003 : org.apache.fop.fo.ValidationException : "구경에게 : 테이블 몸"나는 PNG 파일로 XML을 변환하기 위해 전화를 걸 때 이제 다음과 같은 오류를보고있다 이없는 자식 요소. 필수 내용 모델 : 마커 < XSL 파일 : 라인 # > "fo : table-body"에 하위 요소가 없습니다. 필수 컨텐츠 모델 : 마커 * (테이블 행 + | 테이블 셀 +)는 소스 내에 속성/우선이 빈 요소로 인한 데이터의 문제라고 생각에

(위치 < 라인 # > 참조) XML. 자리 표시 자 값을 누락 된 위치의 XML에 강제로 추가하는 코드를 추가했습니다. 그게 문제를 해결하지 못했을 때, 내가 쓰지 않은 XSL이 문제의 근원 일 가능성이 높습니다.

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:myns="http://xmlapp.fm.net/ns/app/service"> 

    <xsl:template match="/"> 
     <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
      <fo:layout-master-set> 
      <fo:simple-page-master master-name="main"> 
       <fo:region-body margin-top="1cm" margin-bottom="1cm" /> 
       <fo:region-before extent="0.5cm" /> 
       <fo:region-after region-name="xsl-region-after" display-align="before" extent="2.0cm"/> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 

      <fo:page-sequence master-reference="main"> 
      <fo:static-content flow-name="xsl-region-before"> 
       <fo:block>Page title text</fo:block> 
      </fo:static-content> 
      <fo:static-content flow-name="xsl-region-after" > 
       <fo:block-container left="500pt" top="28pt" width="220mm" position="absolute"> 
        <fo:block font-size="16"><xsl:value-of select="//myns:cust" /> : <xsl:value-of select="//myns:docId" /></fo:block> 
       </fo:block-container> 
      </fo:static-content> 
      <fo:flow flow-name="xsl-region-body" > 
       <xsl:call-template name="annotationsTable" /> 
      </fo:flow> 
     </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 

    <xsl:template name="annotationsTable"> 
     <fo:table table-layout="fixed"> 
     <fo:table-header> 
      <fo:table-row> 
       <fo:table-cell><fo:block> Annotation </fo:block></fo:table-cell> 
       <fo:table-cell><fo:block> UserName </fo:block></fo:table-cell> 
       <fo:table-cell><fo:block> UserID </fo:block></fo:table-cell> 
       <fo:table-cell><fo:block> Date </fo:block></fo:table-cell> 
      </fo:table-row> 
     </fo:table-header> 
     <fo:table-body> 
      <xsl:apply-templates select="//myns:annotation" /> 
     </fo:table-body> 
     </fo:table> 
    </xsl:template> 

    <xsl:template match="myns:annotation"> 
     <fo:table-row> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="./myns:text" /> 
      </fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="./@createdByName"/> 
      </fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="./@createdByUserID" /> 
      </fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="./@systemDate" /> 
      </fo:block> 
     </fo:table-cell> 
     </fo:table-row> 
    </xsl:template> 

</xsl:stylesheet> 

우리가 변환하려는 XML의 형식은 다음과 같습니다

<annotation createdByName="Frank" createdByUserID="X1234" systemDate="2014-04-14"> 
    <text>this is the text of an annotation</text> 
</annotation> 

내가 뭔가를 잘못하고 있어요 것을 알고있다. 문제는 무엇을 알기 위해 XSL에 대해 충분히 알지 못한다는 것입니다. 누군가 조언 할 수 있습니까?

감사합니다.

답변

0

no-namespace에있는 소스가 http://xmlapp.fm.net/ns/app/service 네임 스페이스와 일치하는 XPath 식으로 선택되어 있지 않아서 코드가 작동하지 않았습니다. 해결책은 소스에서 네임 스페이스를 기본값으로 선언하거나 (xmlns 특성 추가) XSLT에서 표현식을 수정하여 아니요 네임 스페이스과 일치시킵니다.

1) XSLT를 변경하려면 XPath 요소의 접두어 myns:을 제거하십시오. annotationsTable 템플릿의 myns:annotation에서

다음 myns:annotation 템플릿

<xsl:template name="annotationsTable"> 
    ... 
     <fo:table-body> 
      <xsl:apply-templates select="annotation" /> 
     </fo:table-body> 
    </fo:table> 
</xsl:template> 

myns:annotation에서와 myns:text 요소 :

<xsl:template match="annotation"> 
    <fo:table-row> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="text" /> 
      </fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="@createdByName"/> 
      </fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="@createdByUserID" /> 
      </fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="@systemDate" /> 
      </fo:block> 
     </fo:table-cell> 
    </fo:table-row> 
</xsl:template> 

가 지금은 테이블 본문 내용을 생성해야합니다.

2) 네임 스페이스 접두어가 처음에 있었던 경우 원본에 원래 네임 스페이스가있는 것일 수 있습니다.이제 (모든 요소가 "http://xmlapp.fm.net/ns/app/service"네임 스페이스에 속하고 XSLT가 접두사에 해당 네임 스페이스를 매핑

<annotation xmlns="http://xmlapp.fm.net/ns/app/service" 
      createdByName="Frank" createdByUserID="X1234" systemDate="2014-04-14"> 
    <text>this is the text of an annotation</text> 
</annotation> 

:이 경우 기본 네임 스페이스를 선언, 것 같이 XSLT 을두고 소스를 편집 myns) XPath에서 소스 트리의 노드를 선택할 수 있습니다.

+0

나는 이것을했고 효과가 있었다. 감사! –