2017-10-10 11 views
0

Saxon 및 WildFly 10.0.0. 최종에 문제가 있습니다. 일부 XSLT를 작성했으며 단위 테스트를 실행할 때 제대로 작동하지만 Wildfly에서 동일한 코드를 실행하면 문제가 발생합니다. 내 pom.xml 파일에서Wildfly에서 Saxon을 올바르게 사용하는 방법?

나는 다음과 같은 종속성이 :

<dependency> 
    <groupId>net.sf.saxon</groupId> 
    <artifactId>Saxon-HE</artifactId> 
    <version>9.8.0-4</version> 
</dependency> 

나는 색슨의 몇 가지 버전을 시도하고 심지어는 Xalan을 위해 그것을 교환하지만 여전히 같은 문제를 얻고있다. 유닛 테스트에서는 작동하지만 Wildfly에서는 결코 작동하지 않습니다. 문제는 "Wildfly 케이스"가 단순히 XSLT의 일부를 무시한다는 것입니다. 예를 들어이 부분은 무시됩니다 :

<xsl:for-each select="$var33_Tracking/ns0:PartyIdentification/ns0:Location"> 
    <xsl:variable name="var13_LatLong" as="node()" select="ns0:LatLong"/> 
    <xsl:variable name="var12_cur_as_string" as="xs:string" select="fn:string($var13_LatLong)"/> 
    <xsl:variable name="var14_result" as="xs:string?"> 
     <xsl:choose> 
     <xsl:when test="(fn:string(fn:string-length($var12_cur_as_string)) &gt; '0')"> 
      <xsl:sequence select="$var12_cur_as_string"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:for-each select="ns0:GeoLoc"> 
       <xsl:sequence select="fn:string(.)"/> 
      </xsl:for-each> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:for-each select="$var14_result"> 
     <LatitudinalHemisphere> 
     <xsl:choose> 
      <xsl:when test="(fn:substring-before(., ',') &lt; '0')"> 
       <xsl:sequence select="'S'"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:sequence select="'N'"/> 
      </xsl:otherwise> 
     </xsl:choose> 
     </LatitudinalHemisphere> 
    </xsl:for-each> 
</xsl:for-each> 

그것은 일부 기능과 같습니다 fn:string-length 또는 fn:substring-before이 문제가 발생할 수 있지만, 그 문제를 해결하는 방법을 알아낼 수 없습니다. 어떤 아이디어 또는 팁?

+1

Wildfly에서 영향을받는 XSLT를 사용하려는 방법에 대한 정보가 없어도 여기 누구든지 답변을 시작할 수 있다면 놀라실 것입니다. 일반적으로 "일부 정보"는 [mcve] 여야합니다. 애플리케이션 서버에 전개 된 어떤 것에는 이것이 어려울 수 있음을 인정하지만, 확실하게 컨텍스트와 덜 복잡함을 모두 제공 할 수 있습니다. –

답변

1

Wildfly에 대해 들어 본 적이 없으므로 전문 지식이 필요하지 않으므로 내가 할 수있는 최선의 방법은 진단 제안을 제공하는 것입니다 (사과는 "답"이 아니라고 주장 할 것입니다. 댓글에 너무 오랜 시간이 걸립니다.)

먼저 사소한 스타일 시트가 올바르게 실행되는지, 실제로 색슨에서 실행되는지 확인하십시오. 그렇게하는 간단한 방법은 당신이 내 제안을 위 의도적으로 XSLT 2.0에서 추가 된 시스템 속성을 사용하여 방지 (색슨 버전을 확인하기 위해 추가 시스템 등록 정보를 볼 수 있습니다 작동하는 경우

<xsl:template match="/"> 
    <p>Transformed using <xsl:value-of select="system-property('xsl:vendor')"/></p> 
</xsl:template> 

의 라인을 따라 스타일 시트 함께).

출력이 xsl:message 인가요? 진단 도구를 선택할 수 있습니다. xsl:message을 사용하여 진단 도구를 표시하거나 결과 문서에 일시적으로 포함 할 수 있습니다. 어떤 접근법을 채택할지는 런타임 환경이 얼마나 파손되었는지에 달려 있습니다.

단순한 일을하고 있지만 우리가 보여준 코드가 표시된 xsl : for-each 명령어를 "무시"하는 경우 첫 번째 가장 확실한 가능성은 select식이 빈 시퀀스로 평가된다는 것입니다. 표현식이 항상 빈 시퀀스로 평가 될 것이기 때문에 컴파일러가 표현식을 제거했을 수도 있습니다. 내가 수를 표시하여 시작할 것() 식에 적용 : 시스템이 실제로 당신에게 진단을 제공하고 당신이 그들을보고되고 있는지 어떤지를 보는

count($var33_Tracking/ns0:PartyIdentification/ns0:Location) 

또 다른 한가지입니다. 예를 들어 어딘가에 로그 파일을 보게 될 수도 있습니다.

fn : string()과 같은 기능을 사용하는 것이 문제라고 생각합니다. 이 의혹을 추구하고 정당화 될 수 있는지 생각해 낼 수 있습니까? XSLT에서는 결코 필요없는 접두사 "fn"을 사용하는 것이 유일한 예외입니다. 나는 왜 그것이 어떤 환경에서는 실패를 일으키고 다른 것들은 실패하지 않는지는 알 수 없지만 "fn"접두어가 올바르게 선언되었는지 확인하고, 접두어가 붙지 않도록 함수 호출을 변경하면 어떻게되는지보십시오.

이 변환이 다른 환경에서 서로 다른 결과를 제공 할 수있는 것들을 인식하고, 가능한 원인으로 다음을 제거 가치 :

  • 을 공급

    • 다른 소스 문서 나 스타일 시트 매개 변수 노드의 기본 URI가 다릅니다.

    • 다른 XSLT 소프트웨어 버전 또는 구성

    • 본질적으로 구현에 의존, 예를 들면 것들에

    • 의도하지 않은 의존성 :

    • 다른 XML 파서 (우선 아파치의 Xerces를 사용하는 버그가 JDK 파서을 피하려고) 다른 XML 트리의 노드, 속성의 순서의 문서 순서

    • 당신은 이미 원인을 제거했습니다 느낄 수 있습니다,하지만 난에게 물어

    현재 시간대 또는 기본 언어에

    의도하지 않은 종속성 당신이 나에게 그들을 제거 할 수있는 어떤 증거도주지 않았기 때문에 질문합니다.

  • +0

    답변 해 주셔서 감사합니다. 나는 곧 이것을 점검하고 그것이 어떻게 도움이되었는지 알려줄 것입니다. –