Search code examples
xpathxquery

How to identify distinct xpath for an element that occurs in different level in XML document?


For example, I want to find all the unique xpath of element in below XML. Can you please help on identifying it using xquery or any other way

<a>
<b>
<identify>Level-1</identify>
</b>
<c>
    <identify>Level-2</identify>
    <d>
        <identify>Level-3</identify>
        <e>
            <identify>Level-4-1</identify>
            <identify>Level-4-2</identify>
        </e>
        <f>
            <identify>Level-4</identify>
            <g>
                <identify>Level-5</identify>        
                <identify>Level-5-2</identify>          
            </g>
        </f
    </d>
</c>

Solution

  • Your xml is invalid, but assuming you fix it, try this (based on this):

    xquery version "3.1";
    
    declare namespace functx = "http://www.functx.com";
    declare function functx:path-to-node
      ( $nodes as node()* )  as xs:string* {
    
    $nodes/string-join(ancestor-or-self::*/name(.), '/')
     } ;
    
    let $in-xml := 
    <a>
       <b>
          <identify>Level-1</identify>
       </b>
       <c>
          <identify>Level-2</identify>
          <d>
             <identify>Level-3</identify>
             <e>
                <identify>Level-4-1</identify>
                <identify>Level-4-2</identify>
             </e>
             <f>
                <identify>Level-4</identify>
                <g>
                   <identify>Level-5</identify>
                   <identify>Level-5-2</identify>
                </g>
             </f>
          </d>
       </c>
    </a>
    
    return
    functx:path-to-node($in-xml//*[name()="identify"])
    

    Output:

    "a/b/identify"    
    "a/c/identify"    
    "a/c/d/identify"   
    "a/c/d/e/identify"    
    "a/c/d/e/identify"    
    "a/c/d/f/identify"    
    "a/c/d/f/g/identify"    
    "a/c/d/f/g/identify"