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]