2017-10-10 76 views
0

我遇到了Saxon和WildFly 10.0.0.Final的問題。我編寫了一些XSLT,當我運行單元測試時它們能夠正常工作,但當我在Wildfly上運行相同的代碼時,我遇到了問題。如何正確使用撒克遜蜻蜓?

在我的pom.xml我有依賴關係是這樣的:

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

我想撒克遜的幾個版本,甚至我把它換成Xalan的,但我依然得到了同樣的問題。它在單元測試中工作,但從未與Wildfly一起工作。問題是「Wildfly case」只是忽略了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-lengthfn:substring-before可能導致此問題,但我無法弄清楚如何解決這個問題。任何想法或提示?

+1

如果有人在這裏甚至可以開始回答,但沒有關於如何嘗試在Wildfly中使用受影響的XSLT的信息,我會感到驚訝。一般來說,「一些信息」應該是[mcve]。我承認這對於部署在應用程序服務器中的東西可能很難,但當然你可以提供更多的上下文和更少的東西。 –

回答

1

我從來沒有聽說過Wild,,更不用說它有任何專業知識,所以我能做的最好的是提供一些診斷建議(道歉SO純化論者誰會爭辯說,這不是一個「答案」,但它是太長的評論。)

首先,找出是否trivial樣式表正確運行,如果他們實際上在撒克遜運行。一個簡單的方法來做到這一點是沿

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

線條樣式表如果這樣的作品,你可以看看進一步的系統屬性來確定撒克遜版本(我的建議上面有意避免使用XSLT 2.0添加任何系統屬性)。

你能看到xsl:message輸出嗎?您可以選擇使用診斷:您可以使用xsl:message顯示它們,或者您可以將它們(當然暫時)包含在結果文檔中。您採用哪種方法取決於您的運行環境是多麼糟糕。

如果簡單的東西正在工作,但您向我們展示的代碼是「忽略」顯示的xsl:for-each指令,那麼第一個也是最明顯的可能性是select表達式計算爲空序列。編譯器甚至有可能刪除表達式,因爲它已經決定表達式總是會計算一個空序列。我會通過顯示計數開始()應用到表達式:

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

看另一件事是系統是否實際上是給你的診斷和你沒有看到他們。例如,他們可能會去某個地方的日誌文件。

你說你懷疑使用像fn:string()這樣的函數與它有關。你能追究這種懷疑,並確定它是否合理嗎?這裏唯一不尋常的是你使用「fn」前綴,這在XSLT中是不必要的。我看不出爲什麼會在某些環境中導致失敗,而不是其他問題,但要檢查是否正確聲明瞭「fn」前綴,並查看如果將函數調用更改爲前綴,會發生什麼情況。

這是值得意識到的事情,可以使轉換得到不同的結果在不同的環境,並消除這些爲可能的原因:供應

    • 不同的源文件或樣式表參數節點具有不同的基本URI

    • 不同的XSLT軟件版本或配置

    • 不同的XML解析器(儘量避免JDK解析器,其是嬰兒車:使用Apache的Xerces優先)

    • 意外依賴於東西都是本質上依賴於實現的,例如在不同的XML樹中的節點,屬性的順序文檔順序

    • 當前時區或默認語言

      意外依賴

    你可能會覺得你已經淘汰等原因造成的,但我要問問題,因爲你沒有給我任何證據,讓我消除它們。

  • +0

    非常感謝您的回答。我會盡快檢查,並讓你知道它是如何幫助的。 –