首页 > 解决方案 > 使用 SAXON 转换器工厂转换 XML 不在 Centos AWS 上工作,但在本地工作

问题描述

需要基于一些 XSL 文件使用net.sf.saxon.transformerfactoryimpl转换 XML

XSL 文件是指在 xmlns 部分下的 XSL 中定义的一些扩展函数

xmlns:rad ="http://mywebsite.com/saxon-extension"

当我在本地机器上执行我的代码时,一切正常并且没有错误。当在 AWS centos 中部署相同的代码时没有错误并且转换后的文档不正确。AWS 中的 SAXON 有什么问题吗,centos 我需要启用一些在 XSL 中定义的外部 URL

变压器:

 TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);
if(transformerFactory instanceof net.sf.saxon.TransformerFactoryImpl)
{
    Configuration configuration =((net.sf.saxon.TransformerFactoryImpl)transformerFactory).getCOnfiguration();
SaxonExtensionFunctionRegistery.registerAll(configuration);
}

registerALL 方法:

for (class c:extensionFunction)
{
  try  {
    configuration.registerExtensionFunction((ExtensionFunctionDefination)c.newInstance());

  }
  catch(Exception ex)  {
    log.error("Error registering extension function:",c.getName(),ex);
  }
}

xsl声明及功能:

xmlns:functx="http://www.functx.com" xmlns:rad="http://mywebsite.com/saxon-extension" excluse-result-prefixes="dicom xs rad functx"

<xsl:function name ="dicom:getAccessionNo">
<xsl:param name="dicomNode"/>
<xsl:choose>
<xsl:otherwise>
 <xsl:value-of select="dicom:getElement($dicomNode/attr[@tag='00080050'],rad:getResouce('StudyProcessing','unknownLabel'))"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>

标签: javaamazon-ec2centossaxon

解决方案


您似乎是不同版本的 Saxon,因此首先要确定您使用的是哪些版本。最可靠的方法是在样式表中(在某个适当的位置)添加一条指令,例如

<xsl:message>Using XSLT processor <xsl:value-of select="system-property('xsl:product-version')"/></xsl:message>

在那之后,我们需要症状的更多细节。您说“没有错误,转换后的文件不正确”:这确实没有任何诊断依据。例如,有可能在其中一种情况下,您使用的 Saxon 版本实现了随后更改的 XSLT 规范之一的草稿版本;魔鬼将在细节中。

您将矛头指向扩展函数,但扩展函数的问题通常以致命错误的形式出现,而不是产生不正确的结果。但是,多年来,调用 Saxon 扩展函数时 XPath 到 Java 数据转换的精确细节已经发生了变化,因此这并非不可能指出问题的可能原因。


推荐阅读