2009-02-20 28 views
39

Aşağıdaki koşulu yanıtlayacak bir karmaşık xpath ifadesi oluşturmaya çalışıyorum.Birden çok yüklemeyle Xpath ifadesi

  1. His loginname "kullanici1"
  2. Onun adı "Kullanıcı 1"
  3. Geride olmasıdır:

    Aşağıdaki XML verilerinden

    , Kullanıcı varlık döndürür "operatörü" ve "admin" olmak üzere 2 farklı profil değeri (exa'yı bilmiyorum)

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

birisi böyle bir durum için bir örnek arz misiniz

önde ct sipariş)?

DÜZENLEME: Eklenen

cevap

64

sonra sen yapmalı aşağıdadır:

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

iki testleri Having profile değeri için garip görünebilir, ancak birden çok profile düğüm olduğundan En az bir düğüm testle eşleştiği sürece tatmin olur.

sen aslında bir node olmasına rağmen bir string doğrudan profile karşılaştırabilirsiniz sebebi unsuru düğümün string-value bu durumda value sadece içeriği olan birlikte birleştirilmiş tüm onun soyundan ait string-value olmasıdır .

: profile value fazla unsurları içeriyordu

Eğer (bu güncellenmiş soruyla çalışması gerekir) sadece value dayalı bir uyan profile düğümün varlığını belirlemek için biraz daha karmaşık bir yüklem testini kullanmak zorunda kalacak İşte

+3

Hızlı çözümünüz için teşekkür ederiz. Bunu gibi bir XPATH kullanabilir miyim veya mantığı değiştirebilir: /root/kullanıcı [login = 'user1'] [name = 'Kullanıcı 1'] [profile [value = 'admin']] [profil [ value = 'operator']] – user41767

+2

İlginç - Birden fazla tahminde blok olabileceğini bilmiyordum, ama evet, öyle görünüyor. Serin, şimdi de bir şey öğrendim :-) –

+0

Birden fazla tahmin sadece AND olarak işlev görür, genişletilmiş sözdizimi size VEYA verir, ama ben çokluğunu netlik için tercih ederim. Bunu, önceki kardeş gibi eksenlerle de yapabilirsiniz, ancak böyle basit bir durum için biraz geniş olacaktır. – annakata

1

users varsayarsak karmaşık bir profil varlık köküdür:

/users/user[login='user1' and name='User 1' 
      and (profile='admin' and profile='operator')] 
+0

"Giriş" vb ("@login" vb.) Anlamına geldiğine inanıyorum. Bunlar, XML'de öznitelikler değil, öğelerdir. ;-) – Tomalak

+0

Ne düşünüyordum bilmiyorum: P – dirkgently

6

/root/user[login='user1' and name='User 1' and profile[value='admin'] and profile[value='operator']] 
daha kesin cevap olduğu (Greg kayın cevabı sorununda durum 3. kontrol etmez anda: user eleman tam 2 profile çocuk sahibi olmalıdır):

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

Öğelerin tam sayısını nasıl kontrol edeceğinizi gösteren için teşekkür ederiz. Bununla birlikte, durum 3'ü "tam olarak 2'ye (3 veya daha fazla) sahip olmamak" gibi okumamıştım. –

+0

@AloisMahdal, Soru şu şekildedir: "3." Operatör "ve" admin "olan 2 farklı profil değerine sahiptir. Bu cevaptaki XPath ifadesi tam olarak bunu kontrol eder - 'yönetici' ve 'operatör' profillerine sahiptir ve üçüncü bir profili yoktur. Üçüncü bir profil değeri varsa, kullanıcı aslında 3 farklı profil değerine sahip olacaktır - değil 2. –

+1

Bir iş tanımı, Fransızca ve Almanca bilmem gerektiğini söylüyor. Fransızca, Almanca ve İtalyanca konuşabiliyorsanız, hak kazanır mıyım? Bu ingilizcedir: Ben bir yerli dili ve ben bir dilbilimci değilim, bu yüzden yanlis olabilirim, ama okuyacagim, acikca söyleyemedigimi düsünüyorum (diyelim ki, gerçekten ihtiyaciniz varsa, İtalyanca bilmemelisiniz) listeler asla münhasır değildir. (Size yanlış olduğunu kanıtlamak istemediğimi unutmayın, sadece dilde bir "gri bölge" işaret ediyordum. Yarı-OT için özür dilerim) –

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