2013-06-05 2 views
0

вот мой DTD + XML:xpath - почему мой запрос не работает?

<!DOCTYPE test [ 
    <!ELEMENT team(owner+)> 
    <!ATTLIST team 
    name ID #REQUIRED 
    coach IDREF #REQUIRED 
    > 
    <!ELEMENT owner  (#PCDATA)> 
    <!ELEMENT coach EMPTY> 
    <!ATTLIST coach 
    name ID #REQUIRED 
    > 
    <!ELEMENT game EMPTY> 
    <!ATTLIST game 
    teams IDREFS #REQUIRED 
    winner IDREF #REQUIRED 
    > 
    <!ELEMENT db (coach*,team*,match*)> 
]> 


<?xml version="1.0" ?> 

    <db> 
     <team name = "Hapoel" coach = "Abuksis"> 
      <owner> Eli Tabib</owner> 
     </team> 
     <team name = "Maccabi" coach = "Blat"> 
      <owner> Shimi</owner> 
      <owner> Federman</owner> 
     </team> 
     <team name = "Beitar" coach = "Eli Cohen"> 
      <owner> Arkadi</owner> 
     </team> 
     <team name = "ElitzorLavi" coach = "Eli"> 
      <owner> Zehava</owner> 
      <owner> Dani</owner> 
     </team> 
     <coach name = "Abuksis"/> 
     <coach name = "Eli Cohen"/> 
     <coach name = "Blat"/> 
     <coach name = "Eli"/> 
     <game teams = "Hapoel Maccabi" winner = "Maccabi"/> 
     <game teams = "Hapoel Beitar" winner = "Beitar"/> 
     <game teams = "Maccabi ElitzorLavi" winner = "Maccabi"/> 
     <game teams = "Elitzor Lavi Maccabi" winner = "Maccabi"/> 
    </db> 

я должен найти такие игры, что количество команд < 2. теперь я ожидаю получить только первую игру. Я пробовал этот Xpath: db/game [count (/ @ teams) < 2] но он дает мне все игры .. какая у меня ошибка?

ответ

1

В xpaths есть несколько проблем. Вы должны разделить элементы и атрибуты на /. ./@name можно укоротить до @name только. Кроме того, если вы хотите, чтобы получить имя как результат, вы должны использовать /@name в конце:

db/team[count(owner)>1][not(@name=//game/@winner)]/@name 
+0

пока не работает. и кажется, что для атрибута вам не нужно использовать '/' – user2456731

+0

Я использую http://www.bit-101.com/xpath/ для запуска запроса – user2456731

+0

@ user2456731: вы не используете стандартный XPath. Мое решение работает для меня. – choroba

0

Q .: Я должен найти команды, которые имеют более одного владельца и никогда не выиграл игру.

Try:

db/team[count(owner)>1][not(@name = //game/@winner)] 
+0

спасибо, все еще не работает. когда я пытаюсь db/team [count (owner)> 1] Я получаю две команды (Maccabi & ElizurLavi) , так что проблема не в выигрыше. – user2456731

+0

Я использую http://www.bit-101.com/xpath/ для запуска запроса – user2456731

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