2013-02-21 2 views
0

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" 

답변

1

xmllib2 만 경로 단계에서 연합 오퍼레이터를 사용할 수 XPath는 1.0 알고합니다 ((Book|Magazine) 부).

의 XPath 1.0에서는 이러한 제한하는 근본적인 이유는 XPath는 1.0 시퀀스 만 nodesets의 아무 개념이없는 것입니다 (/Bookstore/Book/Title | /Bookstore/Magazine/Title) 또는 /Bookstore/*[name()='Book' or name()='Magazine']/Title

를 작성해야합니다. 시퀀스 데이터 유형은 XPath 2 및 XQuery 용으로 작성되었습니다. /Bookstore/(Book|Magazine)/Title은 각 경로 단계를 따라 시퀀스를 전달합니다. 즉, 문서 노드, Bookstore 자식 요소, Book 및 Magazine 자식 요소 시퀀스의 합집합을 문서 순서로 정렬 한 다음 Title 요소의 하위 요소를 전달합니다. XPath 1.0의 유니온 연산자는 두 개의 노드 집합을 다른 노드 집합으로 통합 할 수 있으므로 경로 분리 기호의 앞이나 뒤에있는 것이 아니라 "가장 바깥 쪽"표현 컨텍스트에 있어야합니다.

+1

첫 번째 부분은 true입니다.이 구문에는 XPath 2.0이 필요합니다. 제한이 XPath 1.0에있는 이유에 대한 설명은 설득력이 없습니다. XPath 1.0은 그렇게하기로 결정했다면 쉽게 "/"의 rhs에 대한 조합 식을 허용 할 수있었습니다. –