Linux에서 명령 줄 도구를 사용하여 XPath 쿼리를 익히려고합니다 (Stanford의 Class2Go 과정 소개 데이터베이스 소개). 책과 잡지가 모두 포함 된 서점의 BookstoreQ.xml라는 XML 파일을 감안할 때, 나는 명령 줄에서 다음 쿼리를 실행할 수 있습니다Xmllint가 아직 유효하지 않은 XPath 유효하지 않은 쿼리 식은 왜 Saxon에서 유효합니까?
$ 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>
I을
$ xmllint --xpath '/Bookstore/Book/Title | /Bookstore/Magazine/Title'
을 그러나 나는 색슨의 예에서와 같이 똑같은 XPath 쿼리를 사용하려고하면 다음 : 내가 명령 줄에서 xmllint가를 사용하는 경우 다음과 같은 결과를 얻을 수 다음과 같은 오류 메시지가 나타납니다.
$ xmllint --xpath '/Bookstore/(Book|Magazine)/Title' BookstoreQ.xml
XPath error: Invalid Expression
/Bookstore/(Book|Magazine)/Title
^
xmlXPathEval: evaluation failed
XPath evaluation failure
왜?
UPDATE : 문제를 이해하는 저를 도와 주셔서 프랜시스와 마이클
감사합니다. 리눅스의 명령 줄에서 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을 배치 한 것으로 가정합니다. 따라서, 출력 할 것이다 아래 다음 쿼리는 상기 결과 (정확하게 들여) (xmllint가 사용함)
$ xpath.sh "doc('BookstoreQ.xml')/Bookstore/(Book|Magazine)/Title"
첫 번째 부분은 true입니다.이 구문에는 XPath 2.0이 필요합니다. 제한이 XPath 1.0에있는 이유에 대한 설명은 설득력이 없습니다. XPath 1.0은 그렇게하기로 결정했다면 쉽게 "/"의 rhs에 대한 조합 식을 허용 할 수있었습니다. –