سؤال

هل يمكن لأي شخص أن يشرح لي نتائج هذا الاستعلام:

declare @xml xml;
set @xml = '<node attribute="true">Val</node>';

select
    T.c.query('xs:boolean(@attribute[1])') Value,
    T.c.query('xs:boolean(@attribute[1]) = false') ValueEqualsFalse,
    T.c.query('xs:boolean(@attribute[1]) = true') ValueEqualsTrue,
    T.c.query('xs:boolean(@attribute[1]) != false') ValueNotEqualsFalse,
    T.c.query('xs:boolean(@attribute[1]) != true') ValueNotEqualsTrue
from @Xml.nodes('node') T(c);

العمود الأول ، القيمة ، يعيد صحيح. الباقي كل مرة خاطئة. إذن ، بعد أن تمكنت من إلقاء القيمة على النوع الصحيح ، كيف يمكنني التحقق من قيمتها بالفعل؟

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

المحلول

تحتاج إلى استخدام fn:false() أو false() و fn:true() أو true() بدلا من مجرد الكتابة true أو false.

هذا مثال صحيح:

T.c.query('xs:boolean(@attribute[1]) = false()') ValueEqualsFalse,
T.c.query('xs:boolean(@attribute[1]) = true()') ValueEqualsTrue,
T.c.query('xs:boolean(@attribute[1]) != false()') ValueNotEqualsFalse,
T.c.query('xs:boolean(@attribute[1]) != true()') ValueNotEqualsTrue

إذا لم تستخدم الوظيفة false(), false تتم معالجتها كتعبير مسار ، أي أن المعالج يعتقد أنك تستفسر عن أ <false /> عنصر. لذلك ، لا يوجد سوى وظيفة للثوابت true و false, ، لأن هذه هي الطريقة الوحيدة للتمييز بين الثوابت المنطقية والتعبير عن المسار.

أكثر بالتفصيل ، سيظل استخدام النفي عائدا false في كل مثال.

هذا ليس ما تريده (فقط للتظاهر):

T.c.query('not(xs:boolean(@attribute[1])) = false') ValueEqualsFalse,
T.c.query('not(xs:boolean(@attribute[1])) = true') ValueEqualsTrue,
T.c.query('not(xs:boolean(@attribute[1])) != false') ValueNotEqualsFalse,
T.c.query('not(xs:boolean(@attribute[1])) != true') ValueNotEqualsTrue

الحرفيين false و true يتم تقييم كلاهما على تسلسل فارغ لا يطابق القيمة المنطقية false() ولا القيمة المنطقية true().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top