Hi Graydon,
Bridger has already given you a perfect reference.
The XQuery Working Group decided it’s a cleaner solution to do node
tests with typeswitch. If you want to do different things based on the
node type, it should be a good alternative to the string-based
approach:
declare function local:node-type(
$node as node()
) as xs:string {
typeswitch($node)
case element() return 'element'
case comment() return 'comment'
case attribute() return 'attribute'
case text() return 'text'
case document-node() return 'document-node'
case processing-instruction() return 'processing-instruction'
default return error()
};
for $node in (<a/>, <!-- x -->)
return local:node-type($node)
Cheers,
Christian
On Fri, Nov 9, 2018 at 7:17 PM Graydon Saunders <graydonish@gmail.com> wrote:
>
> Hi Bridger --
>
> Those are helpful, thanks!
>
> I was hoping for a built-in (extenstion!) function on the (possibly mistaken) supposition that BaseX just knows that things are in the internal representation and would nigh-certainly be quicker to have something that returns that value directly.
>
> -- Graydon
>
> On Fri, Nov 9, 2018 at 1:10 PM Bridger Dyson-Smith <bdysonsmith@gmail.com> wrote:
>>
>> HI Graydon -
>>
>> it isn't a builtin function, but maybe the functx:node-kind() and functx:sequence-type() functions are what you want[1,2]?
>> Hope that helps.
>>
>> Best,
>> Bridger
>> [1] http://www.xqueryfunctions.com/xq/functx_node-kind.html
>> [2] http://www.xqueryfunctions.com/xq/functx_sequence-type.html
>>
>> On Fri, Nov 9, 2018 at 12:40 PM Graydon Saunders <graydonish@gmail.com> wrote:
>>>
>>> Hi!
>>>
>>> I am overcome with the cabbage-nature today, because I can't find this in the docs.
>>>
>>> I am convinced there's a way to go:
>>>
>>> (//some-element/node()) ! fn:node-type(.)
>>>
>>> and get a sequence of "element(),element(),text()..." but do not know what the actual function is called. (it's not node-type()!)
>>>
>>> How ought I to be approaching this?
>>>
>>> Thanks!
>>> Graydon
>>>
>>>