web-dev-qa-db-ja.com

複数の述部を持つXpath式

次の条件に答える複雑なxpath式を作成しようとしています。

以下のXMLデータから、serエンティティを返します。

  1. 彼のログイン名は「ser1
  2. 彼の名前は「ser 1
  3. 彼には、「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>
    

誰かがそのような場合の例を提供できますか?

編集:複雑なプロファイルエンティティを追加

45
user41767

以下はあなたが望んでいることをするはずです:

/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の内容。

profilevalueよりも多くの要素が含まれている場合は、profileのみに基づいて一致するvalueノードの存在を判断するために、もう少し複雑な述語テストを使用する必要があります(これは更新された質問で動作するはずです):

/root/user[login='user1' and 
           name='User 1' and 
           profile[value='admin'] and
           profile[value='operator']]
70
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'
         ]
6

usersがルートであると仮定します:

/users/user[login='user1' and name='User 1' 
            and (profile='admin' and profile='operator')]
1
dirkgently
/root/user[login='user1' and name='User 1' and profile/value='admin' and profile/value='operator'
0
Ankush Jetly