如何正确使用Saxon和Wildfly?

时间:2017-10-10 18:09:54

标签: xslt wildfly saxon

我对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>

我尝试了几个版本的Saxon,甚至我把它换成了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-lengthfn:substring-before会导致此问题,但我无法弄清楚如何解决该问题。任何想法或提示?

1 个答案:

答案 0 :(得分:1)

我从来没有听说过Wildfly,更不用说有任何专业知识了,所以我能做的最好的就是提供一些诊断建议(向SO纯粹主义者道歉,他们认为这不是一个&#34;答案& #34;,但评论太长了。)

首先,找出琐碎的样式表是否正确运行以及它们是否实际上在Saxon下运行。一种简单的方法是使用

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

如果可行,您可以查看更多系统属性以确定Saxon版本(我上面的建议故意避免使用XSLT 2.0中添加的任何系统属性)。

您能看到xsl:message输出吗?您可以选择诊断:您可以使用xsl:message显示它们,也可以在结果文档中包含它们(当然暂时)。您采用哪种方法取决于运行时环境的破坏程度。

如果简单的事情有效,但你向我们展示的代码是&#34;忽略&#34;显示的xsl:for-each指令,则第一个也是最明显的可能性是select表达式求值为空序列。编译器已删除表达式甚至可能,因为它已决定表达式将始终计算为空序列。我将首先显示应用于表达式的count():

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

另一件需要关注的事情是系统是否实际上为您提供了诊断功能,而您却没有看到它们。例如,他们可能会去某个地方的日志文件。

你说你怀疑像fn:string()这样的函数的使用与它有关。你能否追究这种怀疑并弄清楚它是否合理?这里唯一不寻常的是你使用&#34; fn&#34;前缀,在XSLT中永远不需要。我不明白为什么会在某些环境中导致失败,而不是其他环境,但要检查&#34; fn&#34;正确声明了前缀,看看如果将函数调用更改为无前缀会发生什么。

值得注意的是,可以使转换在不同的环境中产生不同的结果,并将这些结果作为可能的原因消除:

  • 提供了不同的源文档或样式表参数

  • 节点具有不同的基本URI

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

  • 不同的XML解析器(尽量避免JDK解析器,这是错误的:优先使用Apache Xerces)

  • 对本质上依赖于实现的事物的意外依赖,例如:不同XML树中节点的文档顺序,属性顺序

  • 对当前时区或默认语言的无意识依赖

你可能觉得你已经消除了这些原因,但我不得不问这个问题,因为你没有给我任何证据可以让我消除它们。