2014-01-11 5 views
0

У меня есть следующие XML-схемы базы данных фильма:XQUERY с несколькими поисковыми полями

<movies> 
    <movie> 
    <title>A History of Violence</title> 
    <year>2005</year> 
    <country>USA</country> 
    <genre>Crime</genre> 
    <summary>Tom Stall, a humble family man and owner of a 
    popular neighborhood restaurant, lives a quiet but 
    fulfilling existence in the Midwest. One night Tom 
    foils a crime at his place of business and, to his 
    chagrin, is plastered all over the news for his 
    heroics. Following this, mysterious people follow 
    the Stalls' every move, concerning Tom more than 
    anyone else. As this situation is confronted, more 
    lurks out over where all these occurrences have 
    stemmed from compromising his marriage, family 
    relationship and the main characters' former 
    relations in the process.</summary> 
<director>  
     <last_name>Cronenberg</last_name> 
     <first_name>David</first_name> 
     <birth_date>1943</birth_date> 
</director> 
<actor> 
     <first_name>Vigo</first_name> 
     <last_name>Mortensen</last_name> 
     <birth_date>1958</birth_date> 
     <role>Tom Stall</role> 
</actor> 
<actor> 
     <first_name>Maria</first_name> 
     <last_name>Bello</last_name> 
     <birth_date>1967</birth_date> 
     <role>Eddie Stall</role> 
</actor> 
<actor> 
     <first_name>Ed</first_name> 
     <last_name>Harris</last_name> 
     <birth_date>1950</birth_date> 
     <role>Carl Fogarty</role> 
</actor> 
<actor> 
     <first_name>William</first_name> 
     <last_name>Hurt</last_name> 
     <birth_date>1950</birth_date> 
     <role>Richie Cusack</role> 
</actor> 
</movie> 
</movies> 

я создал теперь искать поля для актеров первого/last_name; жанр; страна; год и роль.

Но проблема в том, что она работает только с годом и жанром.

Если я использую

  1. жанр или год: я получить правильные результаты

  2. last_name; first_name; страна; Роль: Я не получаю никакого результата

Я предполагаю, что есть что-то TODO с несколькими актерами и множеством элементов стран, но я couldn't понять, как ее решить.

Вот мой XQUERY код:

xquery version "3.0"; 
(: :declare namespace util="http://exist-db.org/xquery/util";:) 
declare option exist:serialize "method=xhtml media-type=text/html indent=yes"; 

let $year := lower-case(request:get-parameter('year', '')) 
let $genre := request:get-parameter('genre', '') 
let $first_name := request:get-parameter('first_name', '') 
let $last_name := request:get-parameter('last_name', '') 
let $country := request:get-parameter('country', '') 
let $role := request:get-parameter('role', '') 



let $movies := collection('/db/Movie/data')/movies/movie[if(not($genre)) then xs:boolean(1) else equals(genre, $genre)][if(not($year)) then xs:boolean(1) else equals(year, $year)][if(not($country)) then xs:boolean(1) else equals(//country, $country)][if(not($first_name)) then xs:boolean(1) else equals(//actor/first_name, $first_name)][if(not($last_name)) then xs:boolean(1) else equals(//actor/last_name, $last_name)][if(not($role)) then xs:boolean(1) else equals(//actor/role, $role)] 

return 
<html> 
<head> 

    </head> 
    <body> 
     <h1>Search results:</h1> 

     <ol>{ 
for $movie in $movies 
    let $title := $movie/title/text() 
    let $year := $movie/year/text() 
     return 
       <li>{$title} ({$year})</li> 



     }</ol> 
    </body> 
</html> 

Заранее спасибо! Greets

ответ

0

В вашем коде есть опечатка. В предикате фильтра для last_name вы используете переменную $ first_name. Использование немного большего количества строк и пробелов может облегчить выявление таких ошибок.

Вы также можете сделать предикаты немного короче, используя более умное булево выражение. Вы можете заменить xs:boolean(1) на true(), но вы также можете переписать предикаты следующим образом:

[empty($genre) or equals(genre, $genre)] 

HTH!

+0

Спасибо, я исправил опечатку, но она не работает :(Теперь я получаю также для last_name никакого результата больше. – user3181473

+0

@ user3181473: Исправлено удаление этих // перед // страной и т. Д. Они не нужны. Они не должны вредить, думал я, но не используя // (почти) всегда лучше .. – grtjn

Смежные вопросы