3

我正在尝试找到一个简单的 cli 命令来从 linux shell 执行 xquery。我想要的是避免我需要安装的外部依赖项(使用fedora 18)。

我已经找到的是可以通过 yum 安装的 saxon 和 xqilla。如果没有别的,我可以使用它们,但它们不在基本系统中。我希望找到类似于用于进行 xslt 处理的 java 内部类(com.sun.org.apache.xalan.internal.xsltc.cmdline.Transform)。

我的另一个想法是使用 XSLT 将文档转换为所需的 xquery 结果,但单行是不可能的。

我可以用 xqilla 做什么的例子(但正在寻找另一个实用程序):

$ xqilla -i TEST-com.ecample.testcase.MyTestCase.xml <(echo '/testsuite/@failures + /testsuite/@errors')

更新:不完全是我遇到的问题,但我决定默认安装 perl XML::Twig,让我可以灵活地使用 perl 实现复杂的逻辑。这也带来了不错的速度提升,因为不需要为每个 XML 文件派生一个进程。

4

4 回答 4

3

编辑:我刚刚注意到你说你已经找到了撒克逊人。无论如何,我都会留下我的答案,以防万一该示例对将来的任何人有所帮助。


您可以从命令行运行Saxon (XQuery)。您可以通过指向具有 XPath/XQuery 的文件来执行此操作,-q或者您可以直接使用-qs.

下面是一个-qs用于处理简单 XPath 的示例:

输入.xml

<a>
  <b id="x"/>
  <b id="z"/>
  <b id="x"/>
</a>

Saxon 命令行(我使用 Saxon9-HE 进行测试)

java -cp "saxon9he.jar" net.sf.saxon.Query -s:"input.xml" -qs:"/a/b[@id='x']" -o:"results.xml"

结果.xml

<b id="x"/><b id="x"/>

注意:我可以通过将 更改为以下内容来使我的输出格式-qs正确:

-qs:"<results>{/a/b[@id='x']}</results>"

有关更多命令行选项,请查看此处: http: //www.saxonica.com/html/documentation/using-xquery/commandline.html

于 2012-12-19T17:35:57.593 回答
3

对于 XQuery 1,有我的Xidel。像这样工作:

 $ xidel TEST-com.ecample.testcase.MyTestCase.xml -e 'xquery version "1.0"; /testsuite/@failures + /testsuite/@errors'

完全无依赖,但不在基础系统中,不在 java 中,而且它不支持 XML 模式......

于 2012-12-17T17:21:27.137 回答
1

JDK 中没有捆绑 XQuery 处理器,因此您必须单独安装一个。目前尚不清楚为什么您认为这是一个问题。

于 2012-12-17T18:22:32.013 回答
1

不幸的是(或者如果您不喜欢 XML,幸运的是),如果在 Unix 和 Linux 系统中非常零星地支持 XML。

您可以安装广受好评的XML Starlet 系统

否则,搜索 xmllint 总是有帮助的。但请注意,不同的基于操作系统的版本似乎具有不同的功能集,其中一些超出了 linting XML 的范围。但是,它并不总是安装在基本 PATH 中可见,所以

 find / -name 'xmllint*' -ls 2>/dev/null  > xmllintList.txt &

可能,经过一个多小时的搜索,您可能会发现您不知道自己拥有的整个 xml 工具目录!

IHTH。

于 2012-12-19T17:12:43.880 回答