如何从命令行运行 Saxon

Posted

技术标签:

【中文标题】如何从命令行运行 Saxon【英文标题】:How to run Saxon from command line 【发布时间】:2021-12-03 03:55:27 【问题描述】:

谁能发布详细的分步说明如何安装 Saxon (10 HE) 以及如何在 MacOS (10.13.6) 中从命令行运行转换?

我已经在我的电脑上安装了 Java。 我已经从 SourceForge 下载了SaxonHE10-6J.zip 文件。 根据here 的建议,我已将saxon-he-10.6.jar 放在myUserName/Library/Java/Extensions 文件夹中。 然后我打开终端应用程序并输入基于this answer的命令:

java -jar saxon-he-10.6.jar -'/Users/myUserName/Documents/path/to/mystylesheet.xsl' -s:'/Users/myUserName/Documents/path/to/some.xml'

这会导致:

Unable to access jarfile saxon-he-10.6.jar

我的所有尝试,包括将 .jar 文件移动到 /Library/Java/Extensions directory 或在命令中包含 .jar 文件的完整路径,都失败并显示相同的错误消息。

请注意,我不是 Java 开发人员,我不打算在应用程序中使用它。我想要的只是能够偶尔进行一次转换。

我还应该注意,我的 XML 和 XSLT 文件的位置可能会因情况而异。我希望能够将 .jar 文件保存在一个恒定位置并根据需要提供 XML 和 XSLT 文件的路径 - IOW,我想要一个命令模板,我只需要更改 2 个文件路径(可能为转换添加一些选项)。

我需要做什么?

【问题讨论】:

在使用java -jar 之前,您是否能够或已经设法运行其他Java 应用程序?这种方法对撒克逊人或一般来说是失败的吗?如果您提供 jar 的完整文件路径,无论您将其放在何处,我都希望 java -jar 机制能够正常工作。注意-'/Users/myUserName/Documents/path/to/mystylesheet.xsl'好像错了,你要xsl:filetoxsl.xsl 我尝试再次提供 .jar 文件的完整路径,现在它可以工作了。非常感谢!现在,您不知道如何为 Xalan 2.7.2 做同样的事情吗?另外,我是否需要 Saxon 下载中包含的其他文件(例如 jline-2.14.6.jar)? 除非您使用 Gizmo 实用程序,否则您不需要 jline-2.14.6.jar 我想我说得太早了。我已将下载的文件夹移动到另一个位置,现在我收到了Error: Could not find or load main class net.sf.saxon.Transform Caused by: java.lang.ClassNotFoundException: net.sf.saxon.Transform 有关各种文件的问题应在saxonica.com/html/documentation10/about/gettingstarted/… 和saxonica.com/html/documentation10/about/installationjava/… 中回答,运行java -cpjava -jar 在saxonica.com/html/documentation10/using-xsl/commandline 中运行 【参考方案1】:

我自己从不使用它:但是 myUserName/Library/Java/Extensions 就类路径而言是特殊的(您不需要将 JAR 文件放在类路径上的此目录中),但就类路径而言它并不特殊与 -jar 选项有关 - 它需要是正常方式的绝对或相对文件名,与类路径无关。

如果您选择将 JAR 文件放在这个神奇的位置,那么我将使用命令 java net.sf.saxon.Transform options 从类路径中选择 Saxon,而不是直接识别 -jar 位置。

不过,不把撒克逊人放在这个神奇的地方是有充分理由的;一个原因是它会影响实际上不想使用 Saxon 的应用程序(它们可能被编写为使用其他一些 XSLT 处理器,而您可能实际上根本不知道它们使用 XSLT,直到它们停止工作)。

【讨论】:

好的,但是如果我不将 .jar 文件放在那里,那么我将面临一个谜:如果我将它留在我的下载文件夹中,并在命令中提供路径,那么它作品。但是,如果我将它移动到我的 Documents 文件夹中的另一个位置,它会产生上面评论中显示的错误。 AFAICT,唯一的区别是新路径的文件夹名称中带有空格。但是路径是引用的,所以应该没什么区别吧? 我想我可能已经找到了原因。我的一个文件夹名为XML/RSS。在命令行上,这表示为XML:RSS。我将 .jar 文件进一步向下移动,当我点击此文件夹时它停止工作。会是这样吗?但是,当我的 XSLT 和 XML 文件的路径中也使用同一个文件夹时,这怎么可能呢?相同的路径可以对文本文件有效但对 .jar 文件无效吗? 我也想知道java -jar 'path/to/saxon-he-10.6.jar' -xsl:'path/to/mystylesheet.xsl' -s:'path/to/some.xml'java -cp 'path/to/saxon-he-10.6.jar' net.sf.saxon.Transform -xsl:'path/to/mystylesheet.xsl' -s:'path/to/some.xml'之间有什么区别(如果有的话)。 -jar 加载特定的 JAR 文件并执行其主入口点,对于撒克逊 JAR 文件来说,该入口点是 net.sf.saxon.Transform。 -cp 列出要包含在类路径中的多个 JAR 或目录,然后您必须指定一个显式入口点,例如 net.sf.saxon.Transformnet.sf.saxon.Query 谢谢你。您没有解决显然由文件夹名称中的/ 引起的错误的问题。错误消息表明这是一个撒克逊错误。如果移动 .jar 文件,错误就会消失 - 尽管 XML 和 XSLT 文件保留在同一个文件夹中。【参考方案2】:

最终我得到了它的工作。虽然这些并不是我所希望的详细的分步说明,但我将在此总结我到目前为止所学到的知识。希望这可以让我免去我不得不经历的几个小时的挫败感。

确保您的计算机上安装了 Java。如果没有,请下载 从 Oracle 安装。

从 SourceForge 下载 Saxon。解压缩并将其放在您的任意位置 硬盘,除了:

不要放在/Library/Java/ExtensionsmyUserName/Library/Java/Extensions; 请勿将其放置在名称中包含/ 的文件夹中(请参阅下面的说明)。

要启动转换,请发出命令:

java -jar 'path/to/saxon-he-10.6.jar' -xsl:'path/to/mystylesheet.xsl' -s:'path/to/some.xml'

或者,您可以使用:

java -cp 'path/to/saxon-he-10.6.jar' net.sf.saxon.Transform -xsl:'path/to/mystylesheet.xsl' -s:'path/to/some.xml'

此表单也可用于运行 XQuery,方法是更改 net.sf.saxon.Transformnet.sf.saxon.Query

要为您的命令添加更多选项和/或参数,请参阅 此处给出的说明:https://www.saxonica.com/html/documentation10/using-xsl/commandline/ 但不要按照页面顶部关于 基本命令的形式。

欢迎指正/补充。


文件夹名称包含/的问题描述:

    将所有 3 个文件(saxon-he-10.6.jarmystylesheet.xslsome.xml 在我的 Documents 文件夹中名为 XML/RSS 的文件夹中;

    运行以下命令:

    java -jar '/Users/myUserName/Documents/XML:RSS/saxon-he-10.6.jar' -xsl:'/Users/myUserName/Documents/XML:RSS/mystylesheet.xsl' -s:'/Users/myUserName/Documents/XML:RSS/some.xml' 
    

    收到以下错误:

    Error: Could not find or load main class net.sf.saxon.Transform Caused by: java.lang.ClassNotFoundException: net.sf.saxon.Transform
    

    仅将 .jar 文件移动到父文件夹并运行以下命令 命令:

    java -jar '/Users/myUserName/Documents/saxon-he-10.6.jar' -xsl:'/Users/myUserName/Documents/XML:RSS/mystylesheet.xsl' -s:'/Users/myUserName/Documents/XML:RSS/some.xml' 
    

    结果:成功转型。

    将 .jar 文件移回,将文件夹重命名为 XMLRSS 并运行 以下命令:

    java -jar '/Users/myUserName/Documents/XMLRSS/saxon-he-10.6.jar' -xsl:'/Users/myUserName/Documents/XMLRSS/mystylesheet.xsl' -s:'/Users/myUserName/Documents/XMLRSS/some.xml' 
    

    结果:成功转型。

【讨论】:

为什么要用“:”替换“/”?为什么“XML”和“RSS”之间的“/”与您保留的文件夹路径中的其他“/”字符不同?当您将 -jar 选项设置为“/Users/myUserName/Documents/XML/RSS/saxon-he-10.6.jar”时会发生什么? @MichaelKay / 字符在 Macintosh 操作系统中是合法的,其中路径表达式的分隔字符是 :。当谈到基础的 Unix 基础(命令行运行的地方)时,需要交换 2 个字符。我使用内置的脚本应用程序给我quoted form of POSIX path of file "Macintosh HD:Users:myUserName:Documents:XML/RSS:saxon-he-10.6.jar",上面就是结果。 回答你的问题,如果路径如你所建议,我会得到Unable to access jarfile saxon-he-10.6.jar,因为它会寻找一个名为XML的文件夹,其中包含一个名为RSS的文件夹,其中包含.jar文件。我使用的路径是正确的,否则找不到XML和XSLT文件。 好吧,我从来不知道你可以在文件名中使用“/”而不是作为路径分隔符,或者通过将其写为冒号来转义它。看起来,当涉及到 Java 时,你不能。 @MichaelKay 我认为您正在关注一个非必要的细节。对于当前目的,文件夹的名称是XML:RSS。这是 Unix 中的合法名称,我也相信 Java。不过,当 .jar 文件放在此文件夹中时,命令会失败。

以上是关于如何从命令行运行 Saxon的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何XSLT处理命令行工具? [关闭]

关闭 Saxon 中的 xml 标头输出

如何从命令行运行 JUnit 测试用例

如何从命令行运行单个 gradle 任务

如何从命令行运行 WAR 中的类?

Maven:如何从命令行传递参数运行 .java 文件