【问题标题】:Using Saxon/C with Perl在 Perl 中使用 Saxon/C
【发布时间】:2019-11-29 23:32:07
【问题描述】:

Saxon 网站说可以从 Perl 调用 Saxon/C,但我找不到任何示例。我发现 Saxon 的唯一接口是一个旧的 Perl 模块 (XML::Saxon::XSLT2),它使用 Inline::Java 并且显然非常慢。但我找不到任何使用 Saxon/C 的东西。有没有人在这方面取得了成功,可以分享一些提示?

【问题讨论】:

  • 另见XML::LibXSLTXSLT2.0 processor for Perl?。如果模块提供的 C 绑定不够,您也可以使用例如编写自己的绑定。 FFI::PlatypusSwigXSInline::C
  • 感谢您的建议。但我需要 Saxon(符合 3.1),而不是 LibXSLT。我不可能是第一个想将 Saxon 与 Perl 一起使用的人,所以之前必须有人这样做过。 Saxon/C 页面甚至明确表示可以从 Perl 调用它。我不想在这里创建新的东西,只是像其他人那样使用 Saxon 和 Perl。那么你们其他人是如何将 Saxon 与 Perl 一起使用的呢?

标签: perl saxon saxon-c


【解决方案1】:

我们尚未正式完成在 perl 上扩展 Saxon/C 所需的集成工作,它仍在我们的待办事项列表中。因此,我们目前不支持它。我不知道有谁做过这项工作,但我知道这是可以完成的。

在 Saxon 网站上,我们声明可以使用 Perl 等语言创建扩展,因为 Saxon/C 具有 C/C++ 接口。目前,我们只有 PHP 和 Python 的扩展(在下一个版本中可用)。

作为一种解决方法,您可以使用 Perl 中的 exec 函数而不是 Java 版本从 Saxon/C 运行转换命令,从而避免运行 Java VM。

【讨论】:

  • 啊,这解释了撒克逊网站上的声明。谢谢你的澄清。你能告诉我更多关于解决方法的信息吗?我目前正在通过文件句柄运行 Saxon:open(SAXON, "| java -jar saxon9he.jar -s:- -xsl:my.xsl -o:output.xml"),只是为了方便打印 XML 输入到标准输入;这应该等同于以 XML 文件作为输入的 exec。从 Saxon/C 运行转换命令,避免运行 Java VM 会是什么样子?我按照自述文件中的安装说明进行操作,然后卡住了。
  • 请您详细说明您遇到的问题? Transform.c、Query.c 和 Validate.c 文件在 Saxon-/C 安装中的“command”目录中可用。 bash shell 构建脚本也应该在同一目录中以编译和创建可执行文件。可执行文件将以与其 Java 对应的类似方式运行(相同的选项可用)。
  • 为包含 jni.h 的目录添加了包含,但仍然卡住了。似乎缺少一些标头,但看不到有关如何获取 MacOS 标头的说明sh-3.2# ./buildpec-command.sh -I../Saxon.C.API/jni Transform.c:13:14: fatal error: 'windows.h' file not found #include <windows.h>
  • 这是一个错误。缺少 Apple 预处理器指令。请参阅错误问题:saxonica.plan.io/issues/4317 我已修复它并添加了解决方法,只需将文件替换为错误问题中的文件即可。即Transform.c:dev.saxonica.com/repos/archive/opensource/latest9.8/hec/command/…
  • 进度,但现在出现新错误:sh-3.2# ./buildpec-command.sh -I../Saxon.C.API/jni Transform.c:15:13: error: cannot combine with previous 'int' declaration specifier typedef int bool; ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/10.0.1/include/stdbool.h:31:14: note: expanded from macro 'bool' Transform.c:15:1: warning: typedef requires a name [-Wmissing-declarations] Transform.c:217:9: warning: format string is not a string literal (potentially insecure) Transform.c:217:9: note: treat the string as an argument to avoid this
猜你喜欢
  • 1970-01-01
  • 2017-06-09
  • 2020-08-07
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多