2011-01-20 2 views
2

Xslt 2.0으로 변환하려는 xml (JUnit 테스트 결과)이 많습니다. 나는 현재 수행 할 net.sf.saxon.TransformerFactoryImpl을 사용하고XSLT 변환 향상

XML 파일을 검색하는 내 XSLT에 과 fn:collection() 변환. 이처럼 :

<xsl:variable name="files" select="collection('file:///Users/admin/Documents/testxml/?select=*.xml;recurse=yes')"/> 

<xsl:template match="testsuites"> 
<root> 
<xsl:for-each select="$files//testsuites"> 
    <xsl:call-template name="summary"/> 
</xsl:for-each> 
</root>   
</xsl:template> 

나에게 문제를 일으킬 2 점 있습니다 :

  • 첫 번째는 자바 트랜스포머, 나는 XML "소스"를 통과해야하지만, 난 정말 해달라고 내 때문에 필요합니다. xsl은 xml 검색 및 나열을 수행합니다.

  • 초는 10 개 (어쩌면 8 또는 7) xml의 변환을 실행할 때 JVM 힙 공간이 꽉 찼습니다. 나는 heap size를 올릴 수 있지만 변환을 거의 300 xml 적용해야하므로 효율적이지는 않을 것입니다.

변환 할 수있는 XML의 수를 늘리려면 어떻게해야합니까?

감사

편집 :

나는이 같은 saxon:discard-document()를 사용하려고 해요 :

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:saxon="http://saxon.sf.net/"> 
    <xsl:output method="xml" indent="yes"/> 

<xsl:variable name="files" select="collection('file:///Users/admin/Documents/testxml/?select=*.xml;recurse=yes')"/> 

<xsl:template match="testsuites"> 
<root> 
    <xsl:for-each select="for $x in ($files//testsuites)return saxon:discard-document($x)">  
    <xsl:call-template name="summary"/> 
    </xsl:for-each>  
</root>   
</xsl:template> 

하지만 난 여전히 내 힙 공간 오류를 얻고있다. 내가 뭔가 잘못하고 있는거야?

+0

Kay, Saxon의 저자 인 Dr. Kay는 실제로 아래 답변했습니다. Saxon 관련 질문에 대한 최상의 결과를 얻으려면'saxon-help @ lists.sourceforge.net'가 더 나은 자료라는 것을 알 수 있습니다. 케이 (Kay) 박사와 앤드류 웰치 (Andrew Welch) (블로그의 저자)는 모두 그곳에서 활동적입니다. – lavinio

답변

4

:

이 블로그 게시물을 참조 명명 된 템플릿에 변화를 시작할 수 있습니다. 그러나 JAXP API (XSLT 1.0 만 인식)에서는 지원되지 않습니다. Saxon 기능을 최대한 활용하려면 sapapi 인터페이스로 전환하지 않는 것이 가장 좋습니다.

saxon의 경우 : discard-document(), 나는 이걸 가지고 얼마나 멀리 스레드를 따르는 지 확신하지 못합니다. 일련의 문서를 전역 변수에 넣는 것을 피할 것입니다. 대신

<xsl:for-each select="collection(....)/saxon:discard-document(.)//testsuites"> 
    ... 
</xsl:for-each>