具有多个谓词的Xpath表达式

时间:2009-02-20 08:23:25

标签: xml xpath predicate

我正在尝试构建一个复杂的xpath表达式,它将回答以下条件。

从下面的XML数据中,返回用户实体:

  1. 他的登录名是“ user1
  2. 他的名字是“用户1
  3. 他有两个不同的个人资料值,分别是“运营商”和“管理员”(我不知道确切的顺序)

        

    <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>
    
  4. 有人可以为这种情况提供一个例子吗?

    编辑:添加了复杂的个人资料实体

4 个答案:

答案 0 :(得分:70)

以下内容应该是你所追求的:

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

profile值进行两次测试可能看起来很奇怪,但由于有多个profile个节点,只要至少有一个节点与测试匹配,就会满足条件。

您可以将profile直接与string进行比较的原因,即使它实际上是node,但是元素节点的string-value是{{1}它的所有后代连接在一起,在这种情况下只是string-value的内容。

如果value包含的元素多于profile,则必须使用稍微复杂的谓词测试来确定是否存在仅基于{{1}的匹配value节点(这应该与您更新的问题一起使用):

profile

答案 1 :(得分:6)

这是一个更准确的答案(目前Greg Beech的答案没有检查问题中的条件3. user元素必须有2个profile个孩子):

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

答案 2 :(得分:1)

假设users是根:

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

答案 3 :(得分:0)

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