Dear BaseXers, i've got a result from an XQuery that i don't understand and am looking for insight and guidance. i've got a collection called 'Squibble' with three documents in it. They are listed below. The query for $rcrd in collection( 'Squibble' )//record where $rcrd/*[1] = <contentChannel><String>email</String></contentChannel> return $rcrd returns record elements from the first *two* documents. This is surprising to me because the first child of the first record element in the first document is <contactMeUsing>...</contactMeUsing>, not <contentChannel>...</contentChannel>. i was expecting it to return just the record element from the second document. i confess, i don't know anything about XQuery. So, it could be that i don't understand how the where clause is supposed to work. Any clues would be most appreciated. i'm running my tests using - BaseX 6.6 - on Mac OS X 10.6.7 Best wishes, --greg <?xml version="1.0" encoding="UTF-8"?> <record> <contactMeUsing> <String>email</String> </contactMeUsing> <String>{"com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground":{"v":{"@class":"string","$":"for the win Mikail.Mauz@gmail.com "},"_-outer":{"@class ":"com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$"}}}</String> </record> <?xml version="1.0" encoding="UTF-8"?> <record> <contentChannel> <String>email</String> </contentChannel> <String>{"com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground":{"v":{"@class":"string","$":"for the get Donald.Duque@yahoo.com "},"_-outer":{"@class ":"com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$"}}}</String> </record> <?xml version="1.0" encoding="UTF-8"?> <record> <phone> <var>cell</var> </phone> <String>{"com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground":{"v":{"@class ":"string","$":"2xx.6xx.3xxx"},"_-outer":{"@class ":"com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$"}}}</String> </record> -- L.G. Meredith Managing Partner Biosimilarity LLC 7329 39th Ave SW Seattle, WA 98136 +1 206.650.3740 http://biosimilarity.blogspot.com
P.S. To further demonstrate my cluelessness... for $rcrd in collection( 'Squibble' )//record let $k := $rcrd/*[1] where node-name( $k ) = contentChannel return $rcrd returns nothing -- while for $rcrd in collection( 'Squibble' )//record let $k := $rcrd/*[1] return node-name( $k ) returns contactMeUsing contentChannel phone i find this mildly surprising. On Fri, Apr 8, 2011 at 6:44 PM, Meredith Gregory <lgreg.meredith@gmail.com>wrote:
Dear BaseXers,
i've got a result from an XQuery that i don't understand and am looking for insight and guidance. i've got a collection called 'Squibble' with three documents in it. They are listed below. The query
for $rcrd in collection( 'Squibble' )//record where $rcrd/*[1] = <contentChannel><String>email</String></contentChannel> return $rcrd
returns record elements from the first *two* documents. This is surprising to me because the first child of the first record element in the first document is <contactMeUsing>...</contactMeUsing>, not <contentChannel>...</contentChannel>.
i was expecting it to return just the record element from the second document.
i confess, i don't know anything about XQuery. So, it could be that i don't understand how the where clause is supposed to work. Any clues would be most appreciated.
i'm running my tests using
- BaseX 6.6 - on Mac OS X 10.6.7
Best wishes,
--greg
<?xml version="1.0" encoding="UTF-8"?> <record> <contactMeUsing> <String>email</String> </contactMeUsing>
<String>{"com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground":{"v":{"@class":"string","$":"for the win Mikail.Mauz@gmail.com "},"_-outer":{"@class ":"com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$"}}}</String> </record>
<?xml version="1.0" encoding="UTF-8"?> <record> <contentChannel> <String>email</String> </contentChannel>
<String>{"com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground":{"v":{"@class":"string","$":"for the get Donald.Duque@yahoo.com "},"_-outer":{"@class ":"com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$"}}}</String> </record>
<?xml version="1.0" encoding="UTF-8"?> <record> <phone> <var>cell</var> </phone>
<String>{"com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground":{"v":{"@class ":"string","$":"2xx.6xx.3xxx"},"_-outer":{"@class ":"com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$"}}}</String> </record>
-- L.G. Meredith Managing Partner Biosimilarity LLC 7329 39th Ave SW Seattle, WA 98136
+1 206.650.3740
-- L.G. Meredith Managing Partner Biosimilarity LLC 7329 39th Ave SW Seattle, WA 98136 +1 206.650.3740 http://biosimilarity.blogspot.com
P.S. To further demonstrate my cluelessness...
;)
for $rcrd in collection( 'Squibble' )//record let $k := $rcrd/*[1] where node-name( $k ) = contentChannel return $rcrd
This might help you out: for $rcrd in collection( 'Squibble' )//record where name( $rcrd/*[1] ) = "contentChannel" return $rcrd You could also try collection( 'Squibble' )//record[contentChannel] Christian
Dear Meredith,
for $rcrd in collection( 'Squibble' )//record where $rcrd/*[1] = <contentChannel><String>email</String></contentChannel> return $rcrd
In your query, the XML snippets <contentChannel>... is "atomized" (i.e., converted to a string), before it is compared to the atomized result of the first argument. If you want to the equality of your XML fragment, you might want to try the deep-equals() function. A query could look sth like this: let $xml := <contentChannel><String>email</String></contentChannel> for $rcrd in collection( 'Squibble' )//record where deep-equals($rcrd/*[1], $xml) return $rcrd Hope this helps, Christian
Dear Christian, Thanks! The GUI says it's never heard of "deep-equals". Any suggestions? Best wishes, --greg On Fri, Apr 8, 2011 at 6:56 PM, Christian Grün <christian.gruen@gmail.com>wrote:
Dear Meredith,
for $rcrd in collection( 'Squibble' )//record where $rcrd/*[1] = <contentChannel><String>email</String></contentChannel> return $rcrd
In your query, the XML snippets <contentChannel>... is "atomized" (i.e., converted to a string), before it is compared to the atomized result of the first argument. If you want to the equality of your XML fragment, you might want to try the deep-equals() function. A query could look sth like this:
let $xml := <contentChannel><String>email</String></contentChannel> for $rcrd in collection( 'Squibble' )//record where deep-equals($rcrd/*[1], $xml) return $rcrd
Hope this helps, Christian
-- L.G. Meredith Managing Partner Biosimilarity LLC 7329 39th Ave SW Seattle, WA 98136 +1 206.650.3740 http://biosimilarity.blogspot.com
Dear Christian, Thanks for the prompt responses! The last one did the trick. It's now performing as expected. Cheers! Best wishes, --greg On Fri, Apr 8, 2011 at 7:00 PM, Christian Grün <christian.gruen@gmail.com>wrote:
Sorry, it was deep-equal; an example: deep-equals('a','b')
(Hopefully) last correction: deep-equal('a','b')
-- L.G. Meredith Managing Partner Biosimilarity LLC 7329 39th Ave SW Seattle, WA 98136 +1 206.650.3740 http://biosimilarity.blogspot.com
participants (2)
-
Christian Grün -
Meredith Gregory