我对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)) > '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(., ',') < '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
会导致此问题,但我无法弄清楚如何解决该问题。任何想法或提示?
答案 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树中节点的文档顺序,属性顺序
对当前时区或默认语言的无意识依赖
你可能觉得你已经消除了这些原因,但我不得不问这个问题,因为你没有给我任何证据可以让我消除它们。