Lawrence,

thanks for your very interest! I've tried to do exactly like you.

For your first approach
   xmlObj.selectPath("//FUNCTION[.//[EMAIL PROTECTED]'sig4']]");
I get realy good results.

---------------

Trying to fit the second use-case
("finding which SIGNAL nodes are referred to by a given  FRAME")
by launching
   frameXmlObj.selectPath("//[EMAIL PROTECTED]//@idRef]");
unfortunatlly keeps on ending in the following exception:

   java.lang.ArrayIndexOutOfBoundsException: 1
at net.sf.saxon.expr.XPathContextMajor.setLocalVariable(XPathContextMajor.java:213)
   at net.sf.saxon.expr.LetExpression.iterate(LetExpression.java:60)
   at net.sf.saxon.xpath.XPathEvaluator.evaluate(XPathEvaluator.java:183)
at org.apache.xmlbeans.impl.xpath.saxon.XBeansXPath.selectNodes(XBeansXPath.java:95) at org.apache.xmlbeans.impl.xpath.saxon.XBeansXPath.selectPath(XBeansXPath.java:105) at org.apache.xmlbeans.impl.store.Path$SaxonPathImpl$SaxonPathEngine.next(Path.java:496)
   at org.apache.xmlbeans.impl.store.Cursor._toSelection(Cursor.java:919)
at org.apache.xmlbeans.impl.store.Cursor._toNextSelection(Cursor.java:908) at org.apache.xmlbeans.impl.store.Cursor._hasNextSelection(Cursor.java:900) at org.apache.xmlbeans.impl.store.Cursor.hasNextSelection(Cursor.java:2640) at org.apache.xmlbeans.impl.values.XmlObjectBase.selectPath(XmlObjectBase.java:432)

---------------

Maybe the problem is caused - as you mentioned earlier - by the missing saxon8-dom.jar. In the actual XML-Beans-Release I found only saxon8-jdom.jar but not saxon8-dom.jar. ( i.e. neither in xmlbeans-2.1.0.zip nor in the corresponding xmlbeans-current-src.zip)
Do you know from where to get it?

Cheers

Siggi

--------------------------------------------------
Dipl.-Math. (Univ.)
Siegfried Baiz
Sulzer GmbH
Frankfurter Ring 162, D-80807 Muenchen
Tel.: +49 89 31858-264
Fax : +49 89 31858-599
mailto:[EMAIL PROTECTED]
--------------------------------------------------



Lawrence Jones wrote:

Hi Siggi

I had a try at this and it seemed to work to me.

To select, say, all FUNCTION nodes in the whole document which contain
at least one SIGNAL-REF element whose idRef attribute has a particular
value (say 'sig4'), parse the document into an XmlObject and call (on
that same XmlObject):

xmlObj.selectPath("//FUNCTION[.//[EMAIL PROTECTED]'sig4']]");

You will get an array of FUNCTION nodes. If you wanted only the
SIGNAL-REF nodes which match 'sig4' you would do something like this:

xmlObj.selectPath("//FUNCTION//[EMAIL PROTECTED]'sig4']");

Similarly for FRAME nodes.

Finding which SIGNAL nodes are referred to by a given (e.g.) FRAME is
slightly different. Having gotten the XmlObject that represents the
whole document first create an XmlCursor using newCursor(), then
navigate to the FRAME of interest. Then do cursor.getObject(). That will
give you an XmlObject representing that FRAME element. You can then
call:

frameXmlObj.selectPath("//[EMAIL PROTECTED]//@idRef]");

This will return all nodes within the whole document having an attribute
called id which has the same value as any of the idRef attributes in
_any descendant_ of this node (this node being the FRAME node).

If you want to be even more precise you could do something like this:

frameXmlObj.selectPath("//[EMAIL PROTECTED]//@idRef]");

which will return all SIGNAL nodes within the whole document having an
attribute called id which has the same value as any of the idRef
attributes in _any descendant_ of this node (this node being the FRAME
node).

(If you wanted to, you could adopt the same approach to the first
example I gave and replace the hardcoded 'sig4' with navigating to the
SIGNAL node and passing in $this/@id instead of 'sig4').

Hope that helps. As I say I'm not really an XPath expert and this is
really becoming more about XPath than about XmlBeans.

Cheers,

Lawrence

-----Original Message-----
From: Siegfried Baiz [mailto:[EMAIL PROTECTED]
Sent: Tuesday, April 04, 2006 1:36 AM
To: [email protected]
Subject: 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  //[EMAIL PROTECTED]//@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  =
//[EMAIL PROTECTED]//@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:  [email protected]
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  ("//[EMAIL PROTECTED]/@id]")  works
(no
exception)  but  for  some  reason  doesn't  return  anything.  On
the
other
hand,  "//[EMAIL PROTECTED]'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("//[EMAIL PROTECTED]'"  +  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:  [email protected]
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(".//[EMAIL PROTECTED]//@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:[EMAIL PROTECTED]
Sent:  Tuesday,  March  14,  2006  12:11  PM
To:  [email protected]
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("//[EMAIL PROTECTED]/@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/conSelectingXMLwithXQueryPa
t
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:  [EMAIL PROTECTED]
For  additional  commands,  e-mail:  [EMAIL PROTECTED]


_______________________________________________________________________
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:  [EMAIL PROTECTED]
For  additional  commands,  e-mail:  [EMAIL PROTECTED]




_______________________________________________________________________
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:  [EMAIL PROTECTED]
For  additional  commands,  e-mail:  [EMAIL PROTECTED]


_______________________________________________________________________
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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

_______________________________________________________________________
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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to