48

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

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

  1. 他的登录名是“ user1
  2. 他的名字是“用户1
  3. 他有 2 个不同的配置文件值,即“操作员”和“管理员”(我不知道前面的确切顺序)

    <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 回答 4

74

以下应该做你所追求的:

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

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

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

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

/root/user[login='user1' and 
           name='User 1' and 
           profile[value='admin'] and
           profile[value='operator']]
于 2009-02-20T08:40:18.997 回答
8

这是一个更准确的答案(目前 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'
         ]
于 2009-02-20T14:43:09.730 回答
1

假设users是根:

/users/user[login='user1' and name='User 1' 
            and (profile='admin' and profile='operator')]
于 2009-02-20T08:35:10.910 回答
0
/root/user[login='user1' and name='User 1' and profile/value='admin' and profile/value='operator'
于 2013-11-27T11:52:08.100 回答