2009-02-20 64 views
39

我想構建一個複雜的xpath表達式,它將回答以下情況。帶有多個謂詞的Xpath表達式

從下面的XML數據,返回用戶實體,其中:

  1. 他的登錄名是 「USER1
  2. 他的名字是 「用戶1
  3. 他有2個不同的配置文件值是「運營商」和「管理」(我不知道實例提前CT順序)

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

是否有人可以提供一個例子這樣的情況?

編輯:添加一個複雜輪廓實體

回答

64

以下應該做你以後:

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

有兩個測試對於profile值可能看起來很奇怪,但由於有多個profile節點,那麼co只要至少有一個節點符合測試條件,測試就會得到滿足。

您可以直接比較profilestring,即使它實際上是一個node的原因是,一個元素節點的string-value是其所有後代串聯在一起,在這種情況下是value只是內容的string-value

如果profile餘載value更多的元素,你不得不使用稍微複雜的謂詞測試來確定基於剛剛上value(這應該與你的更新問題的工作)匹配的profile節點的存在:

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

感謝您的快速解決方案。 我可以使用這樣一個XPATH,或者它可以改變邏輯: /root/user [login ='user1'] [name ='User 1'] [profile [value ='admin']] [profile [值='操作員']] – user41767 2009-02-20 09:07:49

1

假設users是根:

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

我相信你的意思是「登錄」等(而不是「@login」等)。這些是元素,而不是原始XML中的屬性。 ;-) – Tomalak 2009-02-20 08:41:37

+0

不知道我在想什麼:P – dirkgently 2009-02-20 09:19:00

6

這裏是一個更確切的答案(目前格雷格櫸木的回答並不在問題檢查條件3:在user元素必須恰好有2 profile小孩):

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