2017-10-26 10 views
0

FOP 1.1을 사용하고 있습니다. 최대 20,000자를 포함 할 수있는 텍스트가 있고 그 사이에 공백이 포함되지 않은 텍스트가 xsl을 사용하도록 수정되었습니다. 너비가없는 공간. xml 태그에 1500 자 정도의 문자가 포함되어 있으면 잘 작동합니다. 그 이상의 경우 스택 오버플로 오류가 발생합니다. weblogic 서버의 힙 공간도 2GB입니다. 가능한 해결 방법 또는 xsl에 결함이있는 사람은 누구에게도 도움이 될 수 있습니다. org.apache.xml에서 java.lang.StackOverflowError의 : XSL의 너비가 0 인 경우 stackoverflow 오류가 발생합니다.

는에 의해 발생 - 아래

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    xmlns:locale="xalan://java.util.Locale" 
    xmlns:arrayList="xalan://java.util.ArrayList" 
    xmlns:func="http://exslt.org/functions" extension-element-prefixes="func" 
    version="1.0"> 

.................. 




    <fo:block> 
     <xsl:value-of select="func:callTemplate(summaryData)"/> 
     </fo:block> 

.................. 
    <xsl:template name="zero_width_space_1"> 
      <xsl:param name="data"/> 
      <xsl:param name="counter" select="0"/> 
      <xsl:choose> 
       <xsl:when test="$counter &lt; (string-length($data))"> 
        <xsl:value-of select='concat(substring($data,$counter,1),"&#8203;")'/> 
        <xsl:call-template name="zero_width_space_2"> 
         <xsl:with-param name="data" select="$data"/> 
         <xsl:with-param name="counter" select="$counter+1"/> 
        </xsl:call-template> 
       </xsl:when> 
       <xsl:otherwise> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:template> 

     <xsl:template name="zero_width_space_2"> 
      <xsl:param name="data"/> 
      <xsl:param name="counter"/> 
      <xsl:value-of select='concat(substring($data,$counter,1),"&#8203;")'/> 
      <xsl:call-template name="zero_width_space_1"> 
       <xsl:with-param name="data" select="$data"/> 
       <xsl:with-param name="counter" select="$counter+1"/> 
      </xsl:call-template> 
    </xsl:template> 


     <func:function name="func:callTemplate"> 
      <xsl:param name="string1"/> 
      <xsl:call-template name="zero_width_space_1"> 
       <xsl:with-param name="data" select="$string1"/> 
      </xsl:call-template> 
      <func:result/> 
     </func:function> 
</xsl:stylesheet> 

내가지고있어 오류가 -

아래는 XSL 코드 샘플입니다. utils.FastStringBuffer.append (FastStringBuffer.java:499) at org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.getNodeData (DOM2DTM.java:935) at org.apache.xml.dtm.ref. dom2dtm.DOM2DTM.getNodeData (DOM2DTM.java) : org.apache.xpath.objects.XNodeSet.getStringFromNode (XNodeSet.java:217에서 org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.getStringValue (DOM2DTM.java:827에서 928) ) ) org.apache.xpath.functions.FunctionDef1Arg.getArg0AsString (FunctionDef1Arg.java:97) org.apache.xpath.functions에서 org.apache.xpath.objects.XNodeSet.xstr (XNodeSet.java:256)에 있습니다. FuncStringLength.execute (FuncStringLength.java:45) at org.apache.xpath.Expression.execute (Expression.java:155) at org.apache.xpath.operations.Operation.execute (Operation.java:110) at org.apache.xpath.Expression.bool (Expression.java:186) at org.apache.xpath.XPath.bool (XPath.j org.apache에서 org.apache.xalan.transformer.TransformerImpl.executeChildTemplates에서 org.apache.xalan.templates.ElemChoose.execute (ElemChoose.java:126) (TransformerImpl.java:2400)에서 412) 아바 나는 두 가지의 필요에 의해 혼란 스러워요

답변

1

.xalan.templates.ElemTemplate.execute org.apache.xalan.templates.ElemCallTemplate.execute (ElemCallTemplate.java:248)에서 (ElemTemplate.java:394) 템플릿을 여기에 입력하면 로직을 하나로 결합 할 수 있습니다.

<xsl:template name="zero_width_space_1"> 
    <xsl:param name="data"/> 
    <xsl:param name="counter" select="0"/> 
    <xsl:if test="$counter &lt;= (string-length($data))"> 
     <xsl:value-of select='concat(substring($data,$counter,1),"&#8203;")'/> 
     <xsl:call-template name="zero_width_space_1"> 
      <xsl:with-param name="data" select="$data"/> 
      <xsl:with-param name="counter" select="$counter+1"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

은 또한 당신의 기능은 매우 옳지 않다,주의, 그것은

<func:function name="func:callTemplate"> 
    <xsl:param name="string1"/> 
    <xsl:variable name="result"> 
     <xsl:call-template name="zero_width_space_1"> 
      <xsl:with-param name="data" select="$string1"/> 
     </xsl:call-template> 
    </xsl:variable> 
    <func:result select="$result" /> 
</func:function>  

내가 그 당신의 스택 오버플로 문제를 해결할 수 있는지 모르겠습니다 ... 다음과 같아야합니다. 목적은 각 문자 전에 &#8203;를 삽입하는 경우, 당신은 EXSLT의 tokenize 기능의 사용이 가능하게 할 수

<func:function name="func:callTemplate"> 
    <xsl:param name="string1"/> 
    <xsl:variable name="result"> 
     <xsl:for-each select="str:tokenize($string1, '')"> 
      <xsl:value-of select="concat('&#8203;', .)" /> 
     </xsl:for-each> 
     <xsl:text>&#8203;</xsl:text> 
    </xsl:variable> 
    <func:result select="$result" /> 
</func:function> 
+0

안녕하세요 팀, u는 그것을 말한대로 내가 너무 하나의 템플릿을 사용했지만, 한 스택 오버플로 오류가 해결되지 않았습니다. FOP에 대해 잘 알지 못해서, 제로 너비 공간을 사용하여 텍스트를 줄 바꿈하는 방법에 대해 다른 게시물에서 언급 한 몇 가지 솔루션을 시도했습니다. 은 제공되는 솔루션으로 시도합니다. 빠른 응답을 주셔서 감사합니다 .. – nithin

+0

tim 당신이 준 함수로 시도했지만 오류 아래에 있어요 - SystemId 알 수 없음; 라인 # 3951; 칼럼 # 66; 함수를 찾을 수 없습니다 : 바꾸기 SystemId 알 수 없음; 라인 # 3951; 칼럼 # 66; 함수 토큰을 찾을 수 없습니다. 오전 9 시부 터 사용 중 – nithin

+0

사과드립니다. 내 솔루션은 XSLT 2.0에서만'replace'를 사용했습니다. exslt의 문자열 함수를 사용하여 XSLT 1.0에서 작동하는 솔루션을 제공하기 위해 필자의 답을 수정했습니다. http://xsltransform.net/jxDigUZ –