وظيفة لتحقيق "العنصر لم يكن لديك هذا الطفل؟"

StackOverflow https://stackoverflow.com/questions/1211153

  •  06-07-2019
  •  | 
  •  

سؤال

وأريد أن استرداد الوثائق في مجموعة التي تلبي أن عنصر معين لايوجد عنصر تابع محدد. على سبيل المثال، من "وثائق" اثنين أدناه، سأقوم بتحديد وثيقة 2، حيث أن لديها طفل عنصر، ولكن وثيقة 1، لأنه لا يفعل ذلك.

الوثيقة 1 :

<doc>
 <element>
  <child/>
 </element>
</doc>

Doc2 :

<doc>
 <element>
  <other-child/>
 </element>
</doc>

وحاولت القيام بذلك:

for $item in collection('/db/collection')
where not($item//child)
return $item

ولكن، هذا لا يعمل لسبب ما. كما أنني حاولت توليفات مختلفة من exists، وظائف تسلسل الخ، ولكن لا يمكن الحصول على النتيجة التي أريدها.

لتوضيح، لا يبدو أن اختبار not($item//child) أن تفعل ما أعتقد أنه سيفعل. الاستعلام أعلاه بإرجاع كل وثيقة في مجموعتي، والطقس لديها عنصر أو لا. يعمل معكوس، ولكن:

for $item in collection('/db/collection')
where $item//child
return $item

وهذا بالضبط الاستعلام بإرجاع تلك الوثائق التي لديها عنصر تابع.

وماذا يعطي؟

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

المحلول 2

ويبدو أن يكون خطأ في محرك كسكيري موجودة في (1.2.6) عند استخدام مستندات XML namespaced، لأنه يعمل على الوثائق دون مساحة، وعلى آخر لقطة إس.
المشكله.

نصائح أخرى

وأعتقد أنك في حاجة إلى استخدام على حد سواء لا () ويوجد () لتحقيق النتائج المرجوة. لذلك، أعتقد أنك تريد أن تفعل شيئا مثل:

for $item in collection('/db/collection') return
    if (not(exists($item//child))) then $item
    else ()

وعن القضية مساحة الاسم الخاص بك: إذا كان يستخدم المستند مساحة اسم، ثم يجب أن يكون لديك تصريح مساحة اسم مناسب في بيان كسكيري الخاص بك، مثل declare namespace ns="some_uri";

ويساعد هذا الأمل.
-tjw

لالتفاف على علة، وكيف حول هذا لحظة:

for $item in collection('/db/collection') 
return 
  if ($item//child) then
    $item
  else 
    ()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top