declare function libjn:descendant-pairs($sequence as item()*) { for $item in $sequence return typeswitch ($item) case object() return for $key in jn:keys($item) let $value := $item($key) return ( { $key : $value }, libjn:descendant-pairs($value) ) case array() return libjn:descendant-pairs($item()) default return () };
libjn:descendant-pairs( ( { "foo" : { "bar" : [ 1, 2 ] } }, [ [ { "foo" : "bar", "bar" : "foo" } ] ], true(), 1, jn:null() ) )
{ "foo" : { "bar" : [ 1, 2 ] } } { "bar" : [ 1, 2 ] } { "foo" : "bar" } { "bar" : "foo" }
libjn:descendant-pairs({ "first" : 1, "second" : { "first" : "a", "second" : "b" } })("first")
1 a