获取下一个根节点的名称及其路径的串联

Getting name of the next-to root node and the concatenation of path to it

我正在解析 ElasticSearch 元数据并尝试访问两个值。
鉴于此 XML:

<root>
    <index1>
        <mappings>
            <users>
                <properties>
                    <birthDate>
                        <type>date</type>
                    </birthDate>
                    <born>
                        <properties>
                            <city>
                                <type>text</type>
                            </city>
                        </properties>
                    </born>
                </properties>
            </users>
        </mappings>
    </index1>
</root>
  1. 列出作为基本对象的属性的所有子项名称(没有名称 "properties" 的子项)很简单:

    //properties/*[not(properties)]/name()
    

这个returns"birthDate","city"

  1. 我尝试从上面第 1 节的锚节点获取根之前的顶部节点,在这种情况下,crom "birthplace" 和 "city" 我尝试到达 "index1"。我达到的是

    ancestor::*[ancestor::root]/name()
    

仍然不正确

  1. 我需要连接从锚节点到索引节点的路径,用下划线分隔。所以,这很可能是具有特定条件的 //ancestorstring-join

您能否就 2) 和 3) 提出建议

  1. Select倒数第二个祖先节点:$anchor//ancestor::*[last() - 1]

  2. Select 所有祖先直到倒数第二个,倒数,字符串连接他们的名字:string-join(reverse($anchor//ancestor::*[position() le last() - 1]/name()), '_')