it-swarm.dev

Výraz Xpath s více predikáty

Snažím se vytvořit komplexní xpath výraz, který bude odpovídat na následující podmínky.

Z níže uvedených dat XML vrací Uživatel entita, která:

  1. Jeho přihlašovací jméno je " user1 "
  2. Jeho jméno je " Uživatel 1 "
  3. Má 2 různé hodnoty profilů, které jsou " operátor " a " admin " (nevím přesný příkaz)

     

    <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>
    

Může někdo, prosím, uvést příklad pro takový případ?

EDIT: Přidána entita komplexního profilu

45
user41767

Následující kroky by měly provádět následující kroky:

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

Po dvou testech pro hodnotu profile se může zdát zvláštní, ale protože existuje více uzlů profile, pak bude podmínka splněna, pokud test vyhovuje alespoň jednomu uzlu. 

Důvod, proč můžete profile srovnávat přímo s string, i když ve skutečnosti je node je to, že string-value uzlu elementu je string-value všech jeho potomků spojených dohromady, což je v tomto případě jen obsah value

Pokud profile obsahovalo více elementů než value, bylo by nutné použít mírně složitější test predikátů, abyste mohli zjistit existenci odpovídajícího uzlu profile založeného právě na value (toto by mělo fungovat s aktualizovanou otázkou):

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

Zde je přesnější odpověď (v současné době Greg Beech odpověď nekontroluje podmínku 3. v problému: prvek user musí mít přesně 2 profile děti):

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

Za předpokladu, že users je kořen: 

/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