【问题标题】:Transform XML using SAXON transformer factory not working on Centos AWS but working on local使用 SAXON 转换器工厂转换 XML 不在 Centos AWS 上工作但在本地工作
【发布时间】:2019-08-20 04:08:42
【问题描述】:

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

转换XML

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

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>

【问题讨论】:

  • 您是否在 XSLT 中使用 xsl:function 定义了函数?还是用 Java 实现的扩展功能?无论如何,考虑添加最小但完整的 XML、XSLT、Java 示例,您想要的结果以及您获得的结果以及撒克逊版本和版本的确切细节。
  • 添加XSL和代码,请检查

标签: java amazon-ec2 centos saxon


【解决方案1】:

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

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

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

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

【讨论】:

  • 添加了更多有问题的细节,请检查,使用 saxon-HE 依赖,这里是否有任何操作系统级别的问题,java 代码在 fedora 和 redhat linux 上工作但在 centos 上不工作?
  • 您可能添加了更多细节,但您还没有回答我的问题。我不知道 Fedora、redhat 和 centos 的发行商在他们的发行版中包含了哪些 Saxon 版本,除了问你之外,我没有其他简单的方法可以找到。
  • 另一种方法是忽略与操作系统捆绑的 Saxon 版本,并直接从 SourceForge 或 Maven 自行安装 Saxon。
  • 当我添加这个 得到 TransformerConfigurationException :net.sf.saxon.s9api.SaxonApiException:StyleSheet编译失败
  • 更正了答案中的错字。对不起!但还要注意,如果它仍然失败,则意味着您使用的是 XSLT 1.0 处理器——它本身就提供了丰富的信息。您可以通过使用参数“xsl:vendor”或“xsl:version”调用系统属性来确认这一点,这也适用于 1.0
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 2017-06-05
  • 2023-03-12
  • 2013-09-10
  • 2015-04-28
相关资源
最近更新 更多