为什么这是一个Xmllint的XPath无效查询表达式,但在Saxon中仍然有效?

为什么这是一个Xmllint的XPath无效查询表达式,但在Saxon中仍然有效?,xml,xpath,saxon,xmllint,Xml,Xpath,Saxon,Xmllint,我正在尝试学习在Linux中使用命令行工具进行XPath查询(我正在学习斯坦福大学的Class2Go数据库入门课程)。给定一个名为of a Bookstore(包含书籍和杂志)的XML文件,我可以在命令行中运行以下查询: $ java -cp Saxon-HE-9.4.0.6.jar net.sf.saxon.Query -s:"BookstoreQ.xml" \ -qs:'<results>{/Bookstore/(Book|Magazine)/Title}</

我正在尝试学习在Linux中使用命令行工具进行XPath查询(我正在学习斯坦福大学的Class2Go数据库入门课程)。给定一个名为of a Bookstore(包含书籍和杂志)的XML文件,我可以在命令行中运行以下查询:

$ java -cp Saxon-HE-9.4.0.6.jar net.sf.saxon.Query -s:"BookstoreQ.xml" \
       -qs:'<results>{/Bookstore/(Book|Magazine)/Title}</results>'
但是,如果尝试使用与Saxon示例中相同的XPath查询,则会出现如下错误:

$ xmllint --xpath '/Bookstore/Book/Title | /Bookstore/Magazine/Title'
$ xmllint --xpath '/Bookstore/(Book|Magazine)/Title' BookstoreQ.xml
XPath error: Invalid Expression
/Bookstore/(Book|Magazine)/Title
           ^
xmlXPathEval: evaluation failed
XPath evaluation failure
为什么?

更新: 感谢弗朗西斯和迈克尔帮助我理解这个问题。在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
xmllib2(由xmllint使用)只知道XPath 1.0,而XPath 1.0不能在路径步骤中使用union运算符(《代码》)部分

在XPath 1.0中,必须编写
(/Bookstore/Book/Title |/Bookstore/Magazine/Title)
/Bookstore/*[name()='Book'或name()='Magazine']/Title


这种限制的根本原因是XPath1.0没有序列的概念,只有节点集。序列数据类型是为XPath 2和XQuery创建的
/Bookstore/(Book | Magazine)/Title
沿每个路径步骤传递一个序列:与文档节点的序列,然后是Bookstore子元素,然后是按文档顺序排序的Book和Magazine子元素序列的并集,然后是这些子元素的Title元素。XPath 1.0的union运算符只能将两个节点集统一为另一个节点集,因此它必须位于“最外层”表达式上下文中,而不是在路径分隔符之前或之后。

第一部分是真的:此构造需要XPath 2.0。XPath 1.0中为什么存在限制的解释是不令人信服的;如果XPath 1.0选择在“/”的rhs上使用联合表达式,那么它很容易做到这一点。
#!/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
$ xpath.sh "doc('BookstoreQ.xml')/Bookstore/(Book|Magazine)/Title"