[NTG-context] How could I find the 'depth' of an element found with xml.first()?

Hans Hagen j.hagen at xs4all.nl
Thu Jun 18 19:04:40 CEST 2020

On 6/18/2020 3:24 PM, Gerben Wierda wrote:
> Given the following XML snippet
> 	<opa id=“opa">
> 		<Foo name="SubFoo Level One" id="Foo">
> 			<Foo name="SubFoo Level Two" id="Foo_2">
> 				<bar id="Bar" name="A Bar">
> 					<bar name="Bar Level Three" id="Bar_2">
> 						<Foo id="oma">OmaFoo</Foo>
> 					</bar>
> 				</bar>
> 				<Foo name="Fuzz Level Four" id="Fuzz"/>
> 			</Foo>
> 			<Foo name="SubFoo Level Two" id="Foo_3">
> 				<fuzz name="Fuzz" id="Fuzz_2"/>
> 			</Foo>
> 		</Foo>
> 	</opa>
> How would I go about to find the depth of an item found with an LPATH? E.g.
> //[id="Foo_3"] would find a node at depth 2 (assuming <opa> is at level 0) while //[id=“Fuzz_2"] would find a node at depth 3 and in either cases I would like to get that number (2 or 3) as well as the actual node. I can assume the values for ‘id’  are unique.
> I was wondering how I could go about finding the ‘depth’ of an item in the XML when using the LMTX built-in functions to work with XML. I don’t think there is a default function for that, is there?
You don't deserve an answer because this is not a MWE!


\startxmlsetups xml:mysetups


\startxmlsetups xml:something

     function xml.finalizers.tex.depth(t)
         local d = 0
         local t = t and t[1]
         while t do
             d = d + 1
             t = xml.parent(t)
             if not t then

\startxmlsetups xml:what
     \xmldoifelse {#1} {..[name() == "what"]} {
     } {


I might add it anyway (a faster variant that is),


                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
        tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl

More information about the ntg-context mailing list