如何正确使用 Saxon with Wildfly?
How to use Saxon with Wildfly properly?
我对 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 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)) > '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
可能导致此问题,但我不知道如何解决该问题。有什么想法或提示吗?
我从来没有听说过 Wildfly,更不用说在这方面有任何专业知识了,所以我能做的最好的就是提供一些诊断建议(向那些认为这不是 "answer" 的 SO 纯粹主义者道歉) , 但评论太长了。)
首先,确定琐碎的样式表 运行 是否正确,以及它们是否确实 运行ning 在 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
显示它们,也可以将它们(当然是暂时的)包含在结果文档中。您采用哪种方法完全取决于您的 运行 时间环境有多糟糕。
如果简单的事情有效,但您向我们展示的代码是 "ignoring" xsl:for - 显示的每条指令,那么第一个也是最明显的可能性是 select表达式的计算结果为空序列。编译器甚至有可能删除了表达式,因为它决定表达式的计算结果始终为空序列。我将从显示应用于表达式的 count() 开始:
count($var33_Tracking/ns0:PartyIdentification/ns0:Location)
另一件要看的事情是系统是否真的在给你诊断,而你没有看到它们。例如,他们可能会转到某处的日志文件。
你说你怀疑像fn:string()这样的函数的使用与它有关。你能追究这个怀疑并弄清楚它是否合理吗?这里唯一不寻常的是您使用了 "fn" 前缀,这在 XSLT 中从来都不是必需的。我不明白为什么这会在某些环境中而不是其他环境中导致失败,但请检查 "fn" 前缀是否正确声明,看看如果将函数调用更改为无前缀会发生什么。
值得注意的是可以使转换在不同环境中产生不同结果的事物,并排除这些可能的原因:
提供的源文档或样式表参数不同
节点具有不同的基本 URI
不同的 XSLT 软件版本或配置
不同的 XML 解析器(尽量避免 JDK 解析器,它有问题:优先使用 Apache Xerces)
对本质上依赖于实现的事物的意外依赖,例如不同 XML 树中节点的文档顺序,属性顺序
对当前时区或默认语言的意外依赖
你可能觉得你已经排除了这些原因,但我不得不问这个问题,因为你没有给我任何可以让我排除它们的证据。
我对 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 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)) > '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
可能导致此问题,但我不知道如何解决该问题。有什么想法或提示吗?
我从来没有听说过 Wildfly,更不用说在这方面有任何专业知识了,所以我能做的最好的就是提供一些诊断建议(向那些认为这不是 "answer" 的 SO 纯粹主义者道歉) , 但评论太长了。)
首先,确定琐碎的样式表 运行 是否正确,以及它们是否确实 运行ning 在 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
显示它们,也可以将它们(当然是暂时的)包含在结果文档中。您采用哪种方法完全取决于您的 运行 时间环境有多糟糕。
如果简单的事情有效,但您向我们展示的代码是 "ignoring" xsl:for - 显示的每条指令,那么第一个也是最明显的可能性是 select表达式的计算结果为空序列。编译器甚至有可能删除了表达式,因为它决定表达式的计算结果始终为空序列。我将从显示应用于表达式的 count() 开始:
count($var33_Tracking/ns0:PartyIdentification/ns0:Location)
另一件要看的事情是系统是否真的在给你诊断,而你没有看到它们。例如,他们可能会转到某处的日志文件。
你说你怀疑像fn:string()这样的函数的使用与它有关。你能追究这个怀疑并弄清楚它是否合理吗?这里唯一不寻常的是您使用了 "fn" 前缀,这在 XSLT 中从来都不是必需的。我不明白为什么这会在某些环境中而不是其他环境中导致失败,但请检查 "fn" 前缀是否正确声明,看看如果将函数调用更改为无前缀会发生什么。
值得注意的是可以使转换在不同环境中产生不同结果的事物,并排除这些可能的原因:
提供的源文档或样式表参数不同
节点具有不同的基本 URI
不同的 XSLT 软件版本或配置
不同的 XML 解析器(尽量避免 JDK 解析器,它有问题:优先使用 Apache Xerces)
对本质上依赖于实现的事物的意外依赖,例如不同 XML 树中节点的文档顺序,属性顺序
对当前时区或默认语言的意外依赖
你可能觉得你已经排除了这些原因,但我不得不问这个问题,因为你没有给我任何可以让我排除它们的证据。