You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@xmlbeans.apache.org by Siegfried Baiz <ba...@sulzer.de> on 2006/04/04 10:35:32 UTC

Re: selectPath with FilterExpression using $this

Lawrence,

My Xml-Document looks somehow like this:
<SAMPLE-FRAG>
 <ELEMENTS>
  <FRAMES>
   <FRAME>
    <SIGNAL-INSTANCE>
     <SIGNAL-REF idRef="sig1"/>
    </SIGNAL-INSTANCE>
    <SIGNAL-INSTANCE>
     <SIGNAL-REF idRef="sig2"/>
    </SIGNAL-INSTANCE>
   </FRAME>
   <FRAME>
    <SIGNAL-INSTANCE>
     <SIGNAL-REF idRef="sig2"/>
    </SIGNAL-INSTANCE>
    <SIGNAL-INSTANCE>
     <SIGNAL-REF idRef="sig3"/>
    </SIGNAL-INSTANCE>
    <SIGNAL-INSTANCE>
     <SIGNAL-REF idRef="sig4"/>
    </SIGNAL-INSTANCE>
   </FRAME>
  </FRAMES>
  <FUNCTIONS>
   <FUNCTION>
    <INPUT-PORT>
     <SIGNAL-REF idRef="sig1"/>
    </INPUT-PORT>
    <OUTPUT-PORT>
     <SIGNAL-REF idRef="sig2"/>
    </OUTPUT-PORT>
    <OUTPUT-PORT>
     <SIGNAL-REF idRef="sig4"/>
    </OUTPUT-PORT>
   </FUNCTION>
   <FUNCTION>
    <INPUT-PORT>
     <SIGNAL-REF idRef="sig2"/>
    </INPUT-PORT>
    <INPUT-PORT>
     <SIGNAL-REF idRef="sig3"/>
    </INPUT-PORT>
    <OUTPUT-PORT>
     <SIGNAL-REF idRef="sig4"/>
    </OUTPUT-PORT>
   </FUNCTION>
  </FUNCTIONS>
  <SIGNALS>
   <SIGNAL id="sig1"/>
   <SIGNAL id="sig2"/>
   <SIGNAL id="sig3"/>
   <SIGNAL id="sig4"/>
  </SIGNALS>
 </ELEMENTS>
</SAMPLE-FRAG>

I'm generally interested in resolving relations between
the tree containers FUNCTIONS, FRAMES and SIGNALS.

For example:
	Which FUNCTION- rsp. FRAME-Nodes refer to given Signal?
	Which SIGNAL-Nodes are refererd by a given FRAME rsp. FUNCTION?


By the way I've  checked my classpath:
It contains saxon8.jar but not saxon8-dom.jar.

Thanks and Cheers,

Siggi





Lawrence  Jones  wrote:

>I  too  have  had  a  go  at  this,  but  I  too  am  not  an  XPath  expert.  
>
>First  of  all  make  sure  you  have  _all  of_  saxon8.jar  and  saxon8-dom.jar
>and  xbean_xpath.jar  (in  addition  to  the  normal  xbean.jar  and  the  JSR  173
>jar)  on  your  classpath.  Not  having  saxon8-dom.jar  can  cause  strange
>errors.  Not  having  xbean_xpath.jar  just  means  that  no  XPath  will  work.
>
>Other  than  that  I  think  it  might  just  be  that  we're  not  passing  in  the
>right  XPath.  Siegfried,  can  you  attach  an  example  XML  instance  document
>for  which  you  are  expecting  this  to  work?
>
>Here's  the  one  I  tried:
>
><elem1  xmlns=\"http://laj.org/test\"  >
>  <elem11  id=\"123\"  >text11</elem11>
>  <elem21  id=\"456\"  >text11</elem21>
>  <elem12  idRef=\"123\"  />
>  <elem13  idRef=\"456\"  />
>  <elem14  idRef=\"123\"  />
>  <elem15  idRef=\"456\"  />
>  <elem16  idRef=\"123\"  />
>  <elem17  idRef=\"789\"  />
></elem1>
>
>And  here  are  the  issues  I  see.
>
>1.  The  element  on  which  you  perform  the  selectPath()  call  seems  to
>represent  the  root  as  far  as  the  call  to  selectPath()  is  concerned.  So
>if  e.g.  you  passed  in  only  the  XmlObject  for  <elem11>  above  you  should
>not  expect  any  of  the  other  elements  to  be  returned  regardless  of  the
>XPath  passed  in.  
>
>2.  But  it  is  likely  that  the  elements  with  idRef  in  them  are  _not_
>children  of  the  element  with  id  in  them.  Rather  it  is  likely  that  they
>are  all  members  of  some  larger  document  element  such  as  <elem1>  above.
>So  to  get  the  selectPath()  to  even  consider  them  you  would  need  to  pass
>in  the  XmlObject  for  <elem1>  (or  at  least  some  element  that  is  a  root  to
>all  of  the  results  you  expect).
>
>3.  But  then  the  path  to  the  id  attribute  is  no  longer  $this/@id  as  that
>would  only  match  the  _root_  element  (<elem1>  in  this  case)  having  an  id
>attribute.  Exactly  what  you  need  to  pass  in  depends  on  what  you  want  to
>do  -  if  you  want  to  find  all  idRefs  that  match  _any_  id  attribute
>anywhere  in  the  document  then  you  probably  want  $this//@id  instead.
>
>4.  I  tried  the  XPath  //*[@idRef=$this//@id]  on  the  complete  document
>above  (i.e.  I  executed  selectPath()  on  the  XmlObject  representing
><elem1>)  and  printed  out  the  list  of  XmlObjects  returned  from
>selectPath().  I  got:
>
>Number  of  results  =  5
>results[0]  =  <xml-fragment  idRef="123"/>
>results[1]  =  <xml-fragment  idRef="456"/>
>results[2]  =  <xml-fragment  idRef="123"/>
>results[3]  =  <xml-fragment  idRef="456"/>
>results[4]  =  <xml-fragment  idRef="123"/>
>
>which  is  what  I'd  expect  i.e.  I  get  all  the  nodes  with  an  idRef  that
>matches  any  id  attribute  somewhere  else  in  the  document  (and  I  don't  get
>those  that  do  not  match).  Not  sure  why  they  are  xml-fragment's  rather
>than  proper  individual  elements  with  proper  QNames  but  that's  a
>different  issue.
>
>5.  Note  that  replacing  '$this'  with  '.'  (i.e.  XPath  =  //*[@idRef=.//@id)
>gave  me  an  empty  result  set.  My  guess  is  that  '.'  is  evaluated
>dynamically  (i.e.  it  means  the  current  node  that  the  query  has  evaluated
>to)  compared  to  $this  which  is  bound  statically  at  the  beginning  to  the
>root  node  that  you  pass  in.  (With  the  '.'  version  of  the  XPath  I  think
>you  are  looking  for  a  node  which  has  both  an  id  and  an  idRef  attribute
>where  the  values  are  the  same  -  which  is  a  slightly  different  query.)
>
>I  haven't  tried  this  exhaustively  -  I'm  not  sure  what  would  happen  if
>some  of  the  id  or  idRef  attributes  were  on  elements  at  deeper  levels.
>But  anyway  I  hope  that  helps  get  started.
>
>Cheers,
>
>Lawrence
>
>  
>
>>-----Original  Message-----
>>From:  Radu  Preotiuc-Pietro
>>Sent:  Thursday,  March  30,  2006  1:56  PM
>>To:  user@xmlbeans.apache.org
>>Subject:  RE:  selectPath  with  FilterExpression  using  $this
>>
>>I  was  curious  to  try  this  myself  with  the  new  Saxon  8.6  integration
>>(available  from  the  SVN  head  only,  for  the  moment)  and  what  I  found  is
>>that  the  path  you  are  suggesting  ("//*[@idref=./@id]")  works  (no
>>exception)  but  for  some  reason  doesn't  return  anything.  On  the  other
>>hand,  "//*[@idref='1'"  returns  the  expected  result,  so  on  one  hand  I
>>    
>>
>am
>  
>
>>wondering  if  this  is  maybe  a  bug  in  the  free  version  of  Saxon  and  on
>>    
>>
>the
>  
>
>>other  you  can  use  this  to  workaround  the  problem  by  doing
>>.selectPath("//*[@idref='"  +  node.getId()  +  "'").
>>
>>If  anyone  else  has  other  insights  into  why  the  original  path  does  not
>>work  (with  more  Xpath/Saxon  knowledge),  I'd  also  be  interested  to
>>    
>>
>know.
>  
>
>>Thanks,
>>Radu
>>
>>-----Original  Message-----
>>From:  Cezar  Andrei
>>Sent:  Wednesday,  March  29,  2006  3:30  PM
>>To:  user@xmlbeans.apache.org
>>Subject:  RE:  selectPath  with  FilterExpression  using  $this
>>
>>Hi  Siegfried,
>>
>>I'm  not  an  expert  in  xpath/xquery  but  I'm  pretty  sure  that  $this
>>    
>>
>doesn't
>  
>
>>represent  the  internal  current  node  that  is  processed  by  the  engine.
>>
>>So  you'll  probably  want  to  rewrite  the  expression  to  something  like
>>this:
>>xo.selectPath(".//*[@idRef=.//@id]");
>>
>>As  for  $this,  it's  just  a  variable  that  is  bound  to  the  XmlObject  that
>>you  are  calling  the  selectPath  method  from.  The  '$this'  construction
>>    
>>
>is
>  
>
>>not  in  the  latest  XPath/Xquery  spec  so  it  was  deprecated,  instead  "."
>>should  be  used.
>>
>>The  current  XmlObject  can  be  bound  to  any  user  specified  variable  name
>>as  in  the  following  example:
>>
>>      XmlOptions  options  =  new  XmlOptions();
>>      options.setXqueryCurrentNodeVar("myVariable");
>>      XmlObject[]  res  =  xo.selectPath("declare  variable  $myVariable
>>external;  $myVariable//el1",  options);
>>
>>Which  is  equivalent  to:
>>
>>      XmlObject[]  res  =  xo.selectPath(".//el1",  options);
>>
>>And  to  the  following  (since  in  the  context  of  the  xpath  engine  the  xo
>>    
>>
>is
>  
>
>>considered  the  root):
>>
>>      XmlObject[]  res  =  xo.selectPath("//el1",  options);
>>
>>Since  we  don't  control  Saxon,  we  can't  promise  that  expressions
>>confirming  to  the  spec  will  work.  We  can  only  work  on  making  sure  we
>>make  the  right  calls  into  Saxon.
>>
>>Cezar
>>
>>
>>    
>>
>>>-----Original  Message-----
>>>From:  Siegfried  Baiz  [mailto:baiz@sulzer.de]
>>>Sent:  Tuesday,  March  14,  2006  12:11  PM
>>>To:  user@xmlbeans.apache.org
>>>Subject:  selectPath  with  FilterExpression  using  $this
>>>
>>>Hello,
>>>
>>>for  a  given  XmlObject  xo  with  an  ID-Attribute  'id',  I've  tried  to
>>>launch  the  following  xpath-expression:
>>>
>>>    xo.selectPath("//*[@idRef=$this/@id]")
>>>
>>>in  order  to  get  all  nodes  (with  idRef-Attribute)  refering  to  my  node
>>>      
>>>
>>xo.
>>    
>>
>>>Unfortunatlly  this  expression  seems  not  to  work.  I  always  get  an
>>>java.lang.ArrayIndexOutOfBoundsException  from  the  underlying
>>>
>>>      
>>>
>net.sf.saxon.expr.XPathContextMajor.setLocalVariable(XPathContextMajor.j
>  
>
>>av
>>    
>>
>>>a:213)
>>>
>>>At
>>>
>>>      
>>>
>http://xmlbeans.apache.org/docs/2.0.0/guide/conSelectingXMLwithXQueryPat
>  
>
>>hX
>>    
>>
>>>Path.html
>>>I  found  the  following  notice:
>>>  "Notice  in  the  query  expression  that  the  variable  $this
>>>      
>>>
>>represents
>>    
>>
>>>  the  current  context  node  (the  XmlObject  that  you  are  querying
>>>      
>>>
>>from).
>>    
>>
>>>  In  this  example  you  are  querying  from  the  document  level
>>>      
>>>
>>XmlObject."
>>    
>>
>>>After  reading  that  sentence  I've  been  thinking,  that  $this  is
>>>      
>>>
>somehow
>  
>
>>>similar  to  "curent()"  in  XSLT,  but  maybe  a  got  the  meaning  wrong.
>>>
>>>Does  anyone  know  whats  the  problem  here  rsp.
>>>is  there  a  better  way  to  accomplish  the  same  thing?
>>>
>>>Thanks  a  lot,
>>>
>>>Siggi
>>>
>>>
>>>
>>>
>>>      
>>>
>---------------------------------------------------------------------
>  
>
>>>To  unsubscribe,  e-mail:  user-unsubscribe@xmlbeans.apache.org
>>>For  additional  commands,  e-mail:  user-help@xmlbeans.apache.org
>>>      
>>>
>>    
>>
>_______________________________________________________________________
>  
>
>>Notice:  This  email  message,  together  with  any  attachments,  may
>>    
>>
>contain
>  
>
>>information  of  BEA  Systems,  Inc.,  its  subsidiaries  and
>>    
>>
>affiliated
>  
>
>>entities,  that  may  be  confidential,  proprietary,  copyrighted
>>    
>>
>and/or
>  
>
>>legally  privileged,  and  is  intended  solely  for  the  use  of  the
>>    
>>
>individual
>  
>
>>or  entity  named  in  this  message.  If  you  are  not  the  intended
>>    
>>
>recipient,
>  
>
>>and  have  received  this  message  in  error,  please  immediately  return
>>    
>>
>this
>  
>
>>by  email  and  then  delete  it.
>>
>>---------------------------------------------------------------------
>>To  unsubscribe,  e-mail:  user-unsubscribe@xmlbeans.apache.org
>>For  additional  commands,  e-mail:  user-help@xmlbeans.apache.org
>>
>>
>>    
>>
>_______________________________________________________________________
>  
>
>>Notice:  This  email  message,  together  with  any  attachments,  may
>>    
>>
>contain
>  
>
>>information  of  BEA  Systems,  Inc.,  its  subsidiaries  and
>>    
>>
>affiliated
>  
>
>>entities,  that  may  be  confidential,  proprietary,  copyrighted
>>    
>>
>and/or
>  
>
>>legally  privileged,  and  is  intended  solely  for  the  use  of  the
>>    
>>
>individual
>  
>
>>or  entity  named  in  this  message.  If  you  are  not  the  intended
>>    
>>
>recipient,
>  
>
>>and  have  received  this  message  in  error,  please  immediately  return
>>    
>>
>this
>  
>
>>by  email  and  then  delete  it.
>>
>>---------------------------------------------------------------------
>>To  unsubscribe,  e-mail:  user-unsubscribe@xmlbeans.apache.org
>>For  additional  commands,  e-mail:  user-help@xmlbeans.apache.org
>>    
>>
>
>_______________________________________________________________________
>Notice:  This  email  message,  together  with  any  attachments,  may  contain
>information  of  BEA  Systems,  Inc.,  its  subsidiaries  and  affiliated
>entities,  that  may  be  confidential,  proprietary,  copyrighted  and/or
>legally privileged, and is intended solely for the use of the individual
>or entity named in this message. If you are not the intended recipient,
>and have received this message in error, please immediately return this
>by email and then delete it.
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
>For additional commands, e-mail: user-help@xmlbeans.apache.org
>
>
>  
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: user-help@xmlbeans.apache.org