如何从命令行运行 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 -cp
与java -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.Transform
或 net.sf.saxon.Query
。
谢谢你。您没有解决显然由文件夹名称中的/
引起的错误的问题。错误消息表明这是一个撒克逊错误。如果移动 .jar 文件,错误就会消失 - 尽管 XML 和 XSLT 文件保留在同一个文件夹中。【参考方案2】:
最终我得到了它的工作。虽然这些并不是我所希望的详细的分步说明,但我将在此总结我到目前为止所学到的知识。希望这可以让我免去我不得不经历的几个小时的挫败感。
确保您的计算机上安装了 Java。如果没有,请下载 从 Oracle 安装。
从 SourceForge 下载 Saxon。解压缩并将其放在您的任意位置 硬盘,除了:
不要放在/Library/Java/Extensions
或myUserName/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.Transform
到 net.sf.saxon.Query
。
要为您的命令添加更多选项和/或参数,请参阅 此处给出的说明:https://www.saxonica.com/html/documentation10/using-xsl/commandline/ 但不要按照页面顶部关于 基本命令的形式。
欢迎指正/补充。
文件夹名称包含/
的问题描述:
将所有 3 个文件(saxon-he-10.6.jar
、mystylesheet.xsl
和
some.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的主要内容,如果未能解决你的问题,请参考以下文章