Domanda

Qualcuno può spiegare a me i risultati di questa query:

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);

La prima colonna, valore, restituisce true. Il resto tutto falso di ritorno. Quindi, dopo aver saputo il cast del valore al tipo corretto, come faccio io in realtà controllare il suo valore?

È stato utile?

Soluzione

è necessario utilizzare fn:false() o false() e fn:true() o true() invece di scrivere true o false.

Questo è un esempio corretto:

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

Se non si utilizza la funzione false(), false viene elaborata come un'espressione di percorso, cioè il processore pensa che si richiede per un elemento <false />. Pertanto, esiste solo una funzione per le costanti true e false, perché questo è l'unico modo per distinguere tra le costanti booleane e un'espressione di percorso.

In particolare, utilizzando la negazione sarebbe ancora tornare false in ogni esempio.

Questo non è ciò che si vuole (solo per dimostrare):

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

letterali false e true entrambi sono valutati per una sequenza vuota che non corrisponde al valore booleano false() né il valore true() booleano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top