سؤال

أحاول بناء تعبير XPath المعقد الذي سيجيب على الحالة التالية.

من بيانات XML أدناه، إرجاع المستعمل الكيان الذي:

  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>
    

يمكن للشخص الرجاء تقديم مثال لمثل هذه القضية؟

تحرير: إضافة كيان ملف تعريف معقد

هل كانت مفيدة؟

المحلول

يجب أن تفعل ما يلي ما كنت بعد:

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

وجود اختبارين ل profile قد تبدو القيمة غريبة، ولكن كما أن هناك متعددة profile العقد ثم الحالة ستكون راضية طالما تطابق عقدة واحدة على الأقل من الاختبار.

السبب الذي يمكنك مقارنته 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'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top