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!

\startbuffer[test]
<something>
    <what>
        <what>
            here
        </what>
    </what>
</something>
\stopbuffer

\startxmlsetups xml:mysetups
    \xmlsetsetup{#1}{something|what}{xml:*}
\stopxmlsetups

\xmlregistersetup{xml:mysetups}

\startxmlsetups xml:something
    \xmlflush{#1}
\stopxmlsetups

\startluacode
    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
                break
            end
        end
        context(d)
    end
\stopluacode

\startxmlsetups xml:what
    \xmldoifelse {#1} {..[name() == "what"]} {
        YES
    } {
        NOP
    }
    [\xmlflush{#1}]
    (\xmlfilter{#1}{./depth()})
\stopxmlsetups

\starttext
    \xmlprocessbuffer{main}{test}{}
\stoptext

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

Hans


-----------------------------------------------------------------
                                          Hans Hagen | PRAGMA ADE
              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
       tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

Reply via email to