Search code examples
javaxpathxqueryxqj

xquery to find value of a child attribute by giving values for one attibute at same level and parent and one of


I need to find value for a child attribute by giving values for one attibute at the same level and its parent at highere level.
Another requirement is
find value for a child attribute for which another attribute at same level with maximum value and given value for parent at higher level

Here is my XML

`<root>
  <ACTS>
    <ACT>Play</ACT>
    <A>
      <Day>1</Day>
      <time>Fri Feb 28 13:21:42 IST 2014</time>
    </A>
    <A>
      <Day>2</Day>
      <time>Fri Feb 28 13:21:43 IST 2014</time>
    </A>    
  </ACTS>
  <ACTS>
    <ACT>Study</ACT>
    <A>
      <Day>1</Day>
      <time>Fri Feb 28 13:21:42 IST 2014</time>
    </A>
    <A>
      <Day>2</Day>
      <time>Fri Feb 28 13:21:43 IST 2014</time>
    </A> 
    <A>
      <Day>3</Day>
      <time>Fri Feb 28 13:21:43 IST 2014</time>
    </A>   
  </ACTS>
</root>
`   

and the rquirement is to find the value for time attribute by giving values as Day=3 and ACT =Study

find time where ACT =Study and Day= maximum value under ACT=Study

I have tried the same with xpath and ended up with a mess (not able to retrieve values from Nodelist).

someone please guide me xquery and its usage in java for this..

which is best in this situation xquery or xpath.


Solution

  • let $x :=
    
    <root>
    <ACTS>
    <ACT>Play</ACT>
    <A>
      <Day>1</Day>
      <time>Fri Feb 28 13:21:42 IST 2014</time>
    </A>
    <A>
      <Day>2</Day>
      <time>Fri Feb 28 13:21:43 IST 2014</time>
    </A>    
    </ACTS>
    <ACTS>
    <ACT>Study</ACT>
    <A>
      <Day>1</Day>
      <time>Fri Feb 28 13:21:42 IST 2014</time>
    </A>
    <A>
      <Day>2</Day>
      <time>Fri Feb 28 13:21:43 IST 2014</time>
    </A> 
    <A>
      <Day>3</Day>
      <time>Fri Feb 28 13:21:43 IST 2014</time>
    </A>   
    </ACTS>
    </root>
    

    XQuery -

    let $maxDay := max($x//ACTS[ACT="Study"]/A/Day)
    for $y in $x//ACTS[ACT/text()="Study"]/A[Day/text()=$maxDay]/time
     return $y
    

    XPath -

    //ACTS[ACT/text()="Study"]/A[Day/text()=max(//ACTS[ACT="Study"]/A/Day)]/time
    

    You said - "someone please guide me xquery and its usage in java for this.. "

    For this please refer following posts -

    1. How to read XML using XPath in Java

    2. Parsing XML with XPath in Java

    Assuming your Java code is right, I think, your XPath expression put you in the mess. BTW, above links would guide you for the correctness of Java code.

    You asked - "which is best in this situation xquery or xpath. "

    Google for "Difference between XQuery and XPath", and you will get the answer.

    HTH :)