web-dev-qa-db-de.com

Xpath-Ausdruck mit mehreren Prädikaten

Ich versuche, einen komplexen Xpath-Ausdruck zu erstellen, der die folgende Bedingung erfüllt.

Aus den folgenden XML-Daten wird die Entität User zurückgegeben, die

  1. Sein Loginname ist " user1 "
  2. Sein Name ist " User 1 "
  3. Er hat 2 verschiedene Profilwerte, die " operator " und " admin " sind (ich kenne die genaue Reihenfolge nicht)

     

    <user>
      <login>user1</login>
      <name>User 1</name>
      <profile>
        <value>admin</value>
        <id>2</id>
        <description>admin users</description>
      </profile>
      <profile>
        <value>operator</value>  
        <id>1</id>
        <description>Operator</description>
      </profile>
    </user>
    
    <user>
      <login>user2</login>
      <name>User 2</name>
      <profile>
        <value>admin</value>
        <id>4</id>
        <description>admins users</description>
      </profile>
      <profile>
        <value>poweruser</value>  
        <id>5</id>
        <description>power users</description>
      </profile>
    </user>
    
    </root>
    

Kann jemand bitte ein Beispiel für einen solchen Fall liefern?

BEARBEITEN: Komplexe Profilentität hinzugefügt

45
user41767

Folgendes sollte tun, was Sie wollen:

/root/user[login='user1' and 
           name='User 1' and 
           profile='admin' and
           profile='operator']

Wenn zwei Tests für den Wert profile vorliegen, kann dies ungerade erscheinen. Da es jedoch mehrere profile-Knoten gibt, ist die Bedingung erfüllt, solange mindestens ein Knoten mit dem Test übereinstimmt. 

Sie können profile direkt mit einem string vergleichen, auch wenn es sich tatsächlich um einen node handelt, ist, dass der string-value eines Elementknotens der string-value aller seiner miteinander verketteten Nachkommen ist, was in diesem Fall nur der Inhalt von value ist. 

Wenn profile mehr Elemente als value enthielt, müssten Sie einen etwas komplexeren Vergleichstest verwenden, um das Vorhandensein eines übereinstimmenden profile-Knotens zu ermitteln, der nur auf dem value basiert (dies sollte mit Ihrer aktualisierten Frage funktionieren):

/root/user[login='user1' and 
           name='User 1' and 
           profile[value='admin'] and
           profile[value='operator']]
70
Greg Beech

Hier ist eine genauere Antwort (Die Antwort von Greg Beech prüft derzeit nicht die Bedingung 3. Im Problem: Das Element user muss genau 2 profile Kinder haben.):

/*/user
        [login='user1' 
        and            
         name='User 1' 
        and  
         not(profile[3])
        and          
         profile/value='admin' 
        and           
         profile/value='operator'
         ]
6

Angenommen, users ist die Wurzel: 

/users/user[login='user1' and name='User 1' 
            and (profile='admin' and profile='operator')]
1
dirkgently
/root/user[login='user1' and name='User 1' and profile/value='admin' and profile/value='operator'
0
Ankush Jetly