我正在尝试构建一个复杂的xpath表达式,它将回答以下条件。
从下面的XML数据中,返回用户实体:
他有两个不同的个人资料值,分别是“运营商”和“管理员”(我不知道确切的顺序)
<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>
有人可以为这种情况提供一个例子吗?
编辑:添加了复杂的个人资料实体
答案 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'