2014-10-08 5 views
0

나는 나무의 이런 종류의 큰 XML 파일 (6 기가 바이트)가 있습니다. 문서에서 한 번 스트리밍 제한을 원하지 않습니다. 그래서 copy-of()을 사용하려고했습니다. XSLT 3.0 부분 스트리밍 (작센)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"> 
<xsl:mode streamable="yes" /> 

<xsl:template match="/"> 
    GLOBAL HEADER 
     <xsl:for-each select="/Report/Document/copy-of()" > 
      DOC HEADER 
      documentType: <xsl:value-of select="documentType"/> 
      person/firstname: <xsl:value-of select="person/firstname"/> 

      <xsl:call-template name="fnc1"/> 

      DOC FOOTER 
     </xsl:for-each> 
    GLOBAL FOOTER 
</xsl:template> 

<xsl:template name="fnc1"> 
    documentType again: <xsl:value-of select="documentType"/> 
</xsl:template> 

</xsl:stylesheet> 

가 작동하는 의미에서 : 여기

http://saxonica.com/documentation/html/sourcedocs/streaming/burst-mode-streaming.html 내 XSLT 스타일 시트입니다 : 나는 내가하고 싶은 것은, 여기에 설명되어있는 "버스트 모드"에 매우 근접하다는 것을 생각 copy-of()과 함께 여러 개의 xsl:value-of을 for-each (like in this question)에서 직접 사용할 수 있기 때문입니다.

(그렇지 않으면이 오류 * There are at least two consuming operands: {xsl:value-of} on line 8, and {xsl:value-of} on line 9이)하지만 <xsl:call-template name="fnc1"/>이 오류를 생성하기 때문에 나는 아직도 스트리밍 제약을가 :

내 질문은 그래서
Error at xsl:template on line 4 column 25 of stylesheet.xsl: 
    XTSE3430: Template rule is declared streamable but it does not satisfy the streamability rules. 
    * xsl:call-template is not streamable in this Saxon release 
Stylesheet compilation failed: 1 error reported 

: 부분 스트리밍을 수행하는 방법 (문서는 하나를 제외하고 완전히 하나로드) call-template (및 기타 apply-templates)을 문서에 사용할 수 있으려면?

도움 주셔서 감사합니다.

+0

당신은''대신에'<'을 선택하면 명명 된 템플릿 및/또는 일치하는 템플릿을 사용하여'Document' 요소 노드를 처리 할 수 ​​있어야합니다. 및 그 자손들 DOC FOOTER>'? –

+0

스트림을 사용해 보았지만 같은 오류가있었습니다. 이제'copy-of()'에'apply-templates'를 사용하여 트릭을 만들었습니다.'변환 중 치명적인 오류가 발생했습니다 : java.lang.RuntimeException : 4 행의 템플릿을 내부 오류로 평가 중' – steco

답변

0

컨텍스트 항목이 접지 된 경우 (즉, 스트리밍 된 노드가 아닌 경우) call-template이 스트리밍 가능해야하므로 버그로 간주합니다. 한편 해결 방법이

<xsl:template name="fnc1" mode="fnc1" match="Document"/> 

로 FNC1 선언 또는

<xsl:apply-templates select="." mode="fnc1"/> 

로 호출하는 기능과 템플릿을 교체하고 명시 적 인수로 상황에 맞는 항목을 제공 할 수 있습니다.

현재 버그를 추적 할 수 있습니다

https://saxonica.plan.io/issues/2171

을 우리가 3.0 사양 아직 XSLT 100 % 준수를 선언하지 않지만, 우리가 버그로 9.6 릴리스의 불필요한 출발을 치료하는 것입니다하지 않는 한 그들을 고정하면 제품이 불안정해질 수 있습니다.

+0

고맙습니다. 좋은 성능 (입력 6.4GB, 출력 1.2GB, 처리 시간 4 분). 약간의 문법 에러가 있습니다. match 속성이 필요합니다 :''.(나는 당신의 답을 편집하려했으나 그 주제를 모르는 사람들은 @tylerk @ littlebobbytables @ dmitry-fucintv 덕분에 판을 거절 할 수 있다는 것을 몰랐다)) – steco

+0

xsl : call 이 경우에는 -template가 스트리밍 가능합니다. –