48

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

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

  1. 彼のログイン名は「user1」です
  2. 彼の名前は「ユーザー 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>
    

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

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

4

4 に答える 4

74

以下は、あなたが求めていることを行う必要があります。

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

値に対して 2 つのテストがあるのprofileは奇妙に思えるかもしれませんが、複数のprofileノードがあるため、少なくとも 1 つのノードがテストに一致する限り、条件は満たされます。

実際には aであるにもかかわらず、とprofile直接比較できる理由は、要素ノードの は、連結されたすべての子孫の であり、この場合は の内容にすぎないためです。stringnodestring-valuestring-valuevalue

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 に答える