2011-02-10 4 views
6

여러 XML 파일에서 하나의 책 (XSL FO 사용)을 구성하는 작업이 완료되었습니다. 이 책 (단순 번호, 아니 장에서 재설정 또는 무엇이든)은, 내 순진 접근 방식은 내가 사용 사용 할 파일을 선택하는 집계 XML 파일이이XSLT 번호는 다중 파일 문서의 현재 파일에있는 인스턴스 만 계산합니다.

<xsl:template match="figure"> 
    <fo:block xsl:use-attribute-sets="figure"> 
    .. stuff to deal with images .. 
    <fo:block xsl:use-attribute-sets="figure-caption"> 
     Figure <xsl:number level="any"/>: <xsl:apply-templates/> 
    </fo:block> 
    <fo:block xsl:use-attribute-sets="figure-caption"> 
</xsl:template> 

을 할 수 그래서 같은 document() 기능 :

<xsl:template match="include"> 
    <xsl:apply-templates select="document(@src)"/> 
</xsl:template> 

자, 내 문제는 number가 alw 인 것 같습니다. ays는 현재 파일의 인스턴스 만 계산합니다 (현재는 파일 당 하나 또는 두 개의 이미지 만 있으므로 그림이 모두 '그림 1'또는 '그림 2'임).

두 가지 접근 방식을 고려했습니다. 둘 다 본질적으로 2 단계 XSLT입니다. 첫째, 직접적인 접근 방식은 ID 변환을 사용하여 전체 책을 포함하는 중개 XML을 생성합니다.이 XML은 다른 이유 때문에 내키지 않습니다.

둘째, I이

<xsl:template match="include"> 
    <xsl:apply-templates select="ext:node-set(document(@src))"/> 
</xsl:template> 

같은 시도했지만이 같은 결과를 생성 node-set() 확장을 사용.

아이디어가 있으십니까? 아마도 two-pass 변환이 아닌 것일까요? 어떤 도움이라도 대단히 감사하겠습니다.

+0

좋은 질문, +1. 두 가지 접근 방식에 대한 토론은이 답변에 대한 명확한 권장 사항과 설명을 참조하십시오. –

+0

+1. 그것은 흥미로운 질문입니다. – Flack

+0

+1 사실, 좋은 질문입니다. –

답변

3

두 통과 방법은보다 논리적이고 강력한 방법입니다.

1 패스 접근 방식은 매우 어렵습니다. 하나의 value의 표현식을 <xsl:number>으로 제공 할 수 있으며 "로컬 번호"와 모든 이전 문서의 최대 누적 개수를 더할 수 있습니다.

그러나이 작업을 수행하려면 문서의 순서를 지정해야하며 (이것은 기능적 언어에서 나쁘다) 평면 번호 매기기 체계에서만 작동합니다. 계층 적 번호 매기기가 사용되는 경우 (3.4.2), 이전 문서의 최대 번호부터 계속하는 쉬운 방법은 없습니다.

이 고려 사항 때문에 번호 매기기 전에 모든 문서를 하나로 병합합니다.

+0

+1. 나는 완전히 동의한다. – Flack

+0

+1 인수 용. –

0

보조 XML 문서를 사용하여 마지막 그림 번호를 추적하고 해당 파일을 스타일 시트의 문서로로드 할 수 있습니다. 또는 동일한 스타일 시트 ("실제"FOP 출력 및 숫자 카운터)에서 두 개의 출력 파일을 관리하지 않으려면 이전 장의 FOP 파일을로드하고 그림 캡션의 MAX를 찾습니다.

또는 마지막 숫자를 매개 변수로 기본값 0으로 전달하고 명령 줄에서 매개 변수를 전달할 수 있습니다. 결과의 문서 승순으로 오름차순으로 구문 분석 한 결과 생성 된이 파라미터의 값입니다.

이러한 모든 대안은 소스 문서에서 오름차순으로 차례로 변환을 실행한다고 가정합니다.

더 구조화되고 강력한 솔루션은 색인, 목차 및 그림 테이블과 같은 가로 문서 섹션을 자체 XSLT로 실행되는 "두 번째 패스"에서 생성되는 여러 개의 별도 FO 문서로 관리하는 것입니다.

0

나는 하나의 XML 파일에 모든 문서에 대한 요약 정보를 출력하는 prepass를 작성한 다음이를 숫자 계산의 보조 입력으로 사용한다고 생각합니다. 귀하의 경우 요약 정보는 각 문서에 포함 된 숫자의 개수 일 수 있지만 많은 경우 하이퍼 링크 대상이 될 섹션의 ID와 같은 다른 정보도 보유하는 것이 유용 할 수 있습니다.

2

또한 2 단계 변환을 사용합니다. 그러나 단지 재미를 위해, 하나 개 include 수준없이 반복,이 스타일 시트와 :이 입력으로

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name="vIncludes" select="//include"/> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="include"> 
     <xsl:apply-templates select="document(@src)"/> 
    </xsl:template> 
    <xsl:template match="picture"> 
     <xsl:variable name="vRoot" select="generate-id(/)"/> 
     <xsl:variable name="vInclude" 
         select="$vIncludes[ 
           $vRoot = generate-id(document(@src)) 
           ]"/> 
     <xsl:copy> 
      <xsl:value-of 
       select="count(
          document(
           (.|$vInclude)/preceding::include/@src 
          )//picture | 
          (.|$vInclude)/preceding::picture 
         ) + 1"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

:

<master> 
    <include src="child3.xml"/> 
    <block> 
     <include src="child1.xml"/> 
     <picture/> 
    </block> 
    <include src="child2.xml"/> 
    <picture/> 
</master> 

그리고 'child1.xml'

<child1> 
    <picture/> 
</child1> 

그리고 '자식 2 .xml '

<child2> 
    <picture/> 
</child2> 

그리고 'child3.xml'

<child3> 
    <picture/> 
</child3> 

출력 :

<master> 
    <child3> 
     <picture>1</picture> 
    </child3> 
    <block> 
     <child1> 
      <picture>2</picture> 
     </child1> 
     <picture>3</picture> 
    </block> 
    <child2> 
     <picture>4</picture> 
    </child2> 
    <picture>5</picture> 
</master> 
+0

+1 예를 들어. – Flack

+0

+1. 그것은 참으로 흥미 롭습니다. 그러나 머리 주위를 감싸는 데 시간이 걸렸습니다. 그래서 저는 대신에 2 패스 변환을 시도 할 것입니다. =) – falstro

관련 문제