我正在尝试在 Linux 中使用命令行工具学习 XPath 查询(我正在学习斯坦福的 Class2Go 课程数据库简介)。给定一个名为 BookstoreQ.xml的 XML 文件,该文件包含 Books 和 Magazines,我可以在命令行运行以下查询:
$ java -cp Saxon-HE-9.4.0.6.jar net.sf.saxon.Query -s:"BookstoreQ.xml" \
-qs:'<results>{/Bookstore/(Book|Magazine)/Title}</results>'
它将返回以下结果:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<Title>A First Course in Database Systems</Title>
<Title>Database Systems: The Complete Book</Title>
<Title>Hector and Jeff's Database Hints</Title>
<Title>Jennifer's Economical Database Hints</Title>
<Title>National Geographic</Title>
<Title>National Geographic</Title>
<Title>Newsweek</Title>
<Title>Hector and Jeff's Database Hints</Title>
</results>
如果我在命令行中使用 xmllint,我会得到相同的结果,如下所示:
$ xmllint --xpath '/Bookstore/Book/Title | /Bookstore/Magazine/Title'
但是,如果我尝试使用与 Saxon 示例中相同的 XPath 查询,则会收到如下错误:
$ xmllint --xpath '/Bookstore/(Book|Magazine)/Title' BookstoreQ.xml
XPath error: Invalid Expression
/Bookstore/(Book|Magazine)/Title
^
xmlXPathEval: evaluation failed
XPath evaluation failure
为什么?
更新:
感谢 Francis 和 Michael 帮助我理解这个问题。在 linux 的命令行中使用 XPath 的一种解决方法是使用类似于以下脚本的内容。
#!/bin/bash
# This script to run xpath queries
java -cp Saxon-HE-9.4.0.6.jar net.sf.saxon.Query -qs:"<results>{$1}</results>" \
\!indent=yes
echo
它假定您已将saxon放置在 Java 类路径中的某个位置。因此,下面的查询将输出上述结果(正确缩进):
$ xpath.sh "doc('BookstoreQ.xml')/Bookstore/(Book|Magazine)/Title"