Search code examples
xmlxquerybasex

XPath make output of whole XML by multiple ID's


 <bookstore>
   <book>
      <title lang="en" id="1">Harry Potter</title>
      <price>29.99</price>
    </book>
    
    <book>
      <title lang="en" id="2">Learning XML</title>
      <price>39.95</price>
    </book>
 </bookstore>
<photostore>
 <photo>
      <title lang="en" id="3">Learning XPATH</title>
      <price>1.00</price>
    </photo>
</photostore>

What I trying to achieve is that XPath shows everything (including parents and anchestors) of id=1 and id=3

Output should be:

     <bookstore>
    <book>
      <title lang="en" id="1">Harry Potter</title>
      <price>29.99</price>
    </book>
 </bookstore>
<photostore>
 <photo>
      <title lang="en" id="3">Learning XPATH</title>
      <price>1.00</price>
    </photo>
</photostore>

Solution

  • I am using BaseX 9.5.1 Beta

    XQuery

    declare context item := document {
    <bookstore>
        <book>
            <title lang="en" id="1">Harry Potter</title>
            <price>29.99</price>
        </book>
        <book>
            <title lang="en" id="2">Learning XML</title>
            <price>39.95</price>
        </book>
        <photostore>
            <photo>
                <title lang="en" id="3">Learning XPATH</title>
                <price>1.00</price>
            </photo>
        </photostore>
    </bookstore>  
    };
    
    <bookstore>
    {
      for $x in ./bookstore/*[descendant::*/@id=("1","3")]
      return $x
    }
    </bookstore>
    

    Output

    <bookstore>
      <book>
        <title lang="en" id="1">Harry Potter</title>
        <price>29.99</price>
      </book>
      <photostore>
        <photo>
          <title lang="en" id="3">Learning XPATH</title>
          <price>1.00</price>
        </photo>
      </photostore>
    </bookstore>