次の条件に答える複雑なxpath式を作成しようとしています。
以下のXMLデータから、serエンティティを返します。
彼には、「operator」と「admin」の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>
誰かがそのような場合の例を提供できますか?
編集:複雑なプロファイルエンティティを追加
以下はあなたが望んでいることをするはずです:
/root/user[login='user1' and
name='User 1' and
profile='admin' and
profile='operator']
profile
値に対して2つのテストがあるのは奇妙に思えるかもしれませんが、複数のprofile
ノードがあるため、少なくとも1つのノードがテストに一致する限り条件は満たされます。
profile
を実際にstring
であるにもかかわらず、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']]
より正確な答えがあります(現在、グレッグビーチの答えは条件3をチェックしません:問題:user
要素には正確に2つのprofile
子が必要です) :
/*/user
[login='user1'
and
name='User 1'
and
not(profile[3])
and
profile/value='admin'
and
profile/value='operator'
]
users
がルートであると仮定します:
/users/user[login='user1' and name='User 1'
and (profile='admin' and profile='operator')]
/root/user[login='user1' and name='User 1' and profile/value='admin' and profile/value='operator'