@Christian and Lukas: Many thanks for helping me with the transform expression so far.
However, I am not sure if we can use both non-updating and updating expressions in a single query ? Meaning, I am trying to modify one document and insert the modified document into the second document.
*Example:*
let $newchild := "This is a child node"
copy $c := <entry><title>How to use updating and non-updating expressions together</title> <child>child 1<child> <child>child 2</child> </entry> modify ( for $child in $c//child return replace value of node $child with $newchild )
return insert node $c into doc('seconddocument')
I also tried:
let $newchild := "This is a child node"
copy $c := <entry><title>How to use updating and non-updating expressions together</title> <child>child 1<child> <child>child 2</child> </entry>
return
modify ( for $child in $c//child return replace value of node $child with $newchild ) insert node $c into doc('seconddocument')
Of course, I can achieve this when I use two xqueries (one to return the modified document and the other to insert it into a second document). But, it would be great if I could perform both actions in a single query.
Thanks, Sony
On Fri, Feb 25, 2011 at 2:54 AM, Christian Grün christian.gruen@gmail.comwrote:
I'm sure the somewhat unrelated syntax error message didn't help you to find this ... sorry for that.
I agree with Lukas. I've revised the misleading error feedback; feel free to check out the latest build:
http://files.basex.org/releases/latest/
C. ___________________________
On Fri, Feb 25, 2011 at 7:46 AM, Lukas Kircher lukaskircher1@googlemail.com wrote:
Hey Sony,
I found another small typo in your query - the keyword 'node' is missing in your replace statement. So if you execute the query below you should be fine.
for $childentry in $c//childentry return replace value of node $childentry/@id with concat('New Child: ', data($c//childentry/@id))
Regards, Lukas
On Thu, Feb 24, 2011 at 11:08 PM, Sony Vijay sony.vibh@gmail.com
wrote:
.. I see the syntax error : [XPST0003] Expecting ")", found "v". when I try :
for $childentry in $c//childentry return replace value of $childentry/@id with concat('New Child: ', data($c//childentry/@id))
To modify the child entries like so: <childentry id="1"> ----- > <childentry id="New Child: 1">
On Thu, Feb 24, 2011 at 5:03 PM, Sony Vijay sony.vibh@gmail.com
wrote:
... Replacing the values of attribute nodes doesn't seem to work as expected when I use modify. Please see my previous post with correction
in
the typo.
On Thu, Feb 24, 2011 at 5:00 PM, Sony Vijay sony.vibh@gmail.com
wrote:
Please ignore the typo. My sample xquery looks something like this:
for $childentry in $c//childentry return replace value of $childentry/@id with concat('New Child: ', data($c//childentry/@id))
To modify the child entries like so: <childentry id="1"> ----- > <childentry id="New Child: 1">
On Thu, Feb 24, 2011 at 4:50 PM, Sony Vijay sony.vibh@gmail.com
wrote:
Christian, Yes. I did realize that I must use a RETURN statement. I tried that with a slight change in the requirement. Say, my child entries look
like so
:
<childentry id="1" /> I tried: for $childentry in $c//childentry return replace value of $childentry/@id with concat('New Child: ', $c//childentry/text()) Does replace work differently for attributes ? Thanks, Sony
On Thu, Feb 24, 2011 at 3:27 PM, Christian Grün christian.gruen@gmail.com wrote: > > Sony, > > each FLWOR expression needs to be completed with a RETURN statement. > Please insert the following snippet (haven't tried it live): > > for $childentry in $c//childentry > return replace value of $childentry with > concat('New Child: ', $c//childentry/text()) > > Hope this helps, > Christian > ___________________________ > > Christian Grün > Uni KN, Box 188 > 78457 Konstanz, Germany > http://www.inf.uni-konstanz.de/~gruen > > > > On Thu, Feb 24, 2011 at 9:24 PM, Sony Vijay sony.vibh@gmail.com > wrote: > > Christian, > > Thank you very much for helping me with the query. However, I am
not
> > quite > > sure how the transform operation works if I have to use a for
loop.
> > Say, I > > twist around yesterday's question a bit like so: > > copy $c := > > <entry> > > <id>1</id> > > <title>How to use a transform expression</title> > > <updated>2011-02-23</updated> > > <author> > > <name>BaseX Team</name> > > <uri>http://basex.org</uri> > > </author> > > <childentry> 1 </childentry> > > <childentry> 2 </childentry> > > <childentry> 3 </childentry> > > <content type="html">Transform expression example created by
BaseX
> > Team</content> > > </entry> > > modify ( > > replace value of node $c//name with 'BaseX', > > replace value of node $c//content with concat('Copy of: ', > > $c//content), > > insert node <member>Joey</member> into $c//author > > for $childentry in $c//childentry > > replace value of $childentry with concat('New Child: ', > > $c//childentry/text()) > > ) > > return $c > > > > The expected output is: > > <entry> > > <id>1</id> > > <title>How to use a transform expression</title> > > <updated>2011-02-23</updated> > > <author> > > <name>BaseX</name> > > <uri>http://basex.org</uri> > > <member>Joey</member> > > </author> > > <childentry> New Child: 1 </childentry> > > <childentry> New Child: 2 </childentry> > > <childentry> New Child: 3 </childentry> > > <content type="html">Copy of: Transform expression example
created
> > by > > BaseX Team</content> > > </entry> > > The following exception is thrown when I tried my sample > > transformation > > query with the for loop: > > [XPST0003] Expecting 'where', 'order' or 'return' expression. > > Thanks, > > Sony > > PS: @Lukas: I did notice the update in the documentation. Thank
you
> > ! > > > > > > On Wed, Feb 23, 2011 at 2:32 AM, Lukas Kircher > > lukaskircher1@googlemail.com wrote: > >> > >> Hi Sony, > >> > >> to help others with the same question, I allowed myself to > >> add a modified version of your example to our > >> documentation [1]. > >> > >> Regards, > >> Lukas > >> > >> > >> [1] http://docs.basex.org/wiki/Update#transform > >> > >> > >> > >> On Wed, Feb 23, 2011 at 6:58 AM, Sony Vijay <sony.vibh@gmail.com
> >> wrote: > >>> > >>> Christian, > >>> Thank you for the quick and helpful reply. > >>> - Sony > >>> > >>> On Tue, Feb 22, 2011 at 5:56 PM, Christian Grün > >>> christian.gruen@gmail.com wrote: > >>>> > >>>> Sony, > >>>> > >>>> the following query might do what you want: > >>>> > >>>> copy $c := > >>>> <entry xmlns="http://www.w3.org/2005/Atom" > >>>> xmlns:libx="http://libx.org/xml/libx2%22%3E > >>>> <id>1</id> > >>>> <title>Link Amazon By ISBN</title> > >>>> <updated>2010-09-29T18:37:48.592Z</updated> > >>>> <author> > >>>> <name>LibX Team</name> > >>>> <uri>http://libx.org</uri> > >>>> <email>libx.org@gmail.com</email> > >>>> </author> > >>>> <content type="html">Content created by LibX Libapp > >>>> Builder</content> > >>>> </entry> > >>>> modify ( > >>>> replace value of node $c//*:name with 'Sony', > >>>> replace value of node $c//*:content with > >>>> concat('Copy of: ', $c//*:content) > >>>> ) > >>>> return $c > >>>> > >>>> > >>>> Best, > >>>> Christian > >>>> ___________________________ > >>>> > >>>> On Tue, Feb 22, 2011 at 11:43 PM, Sony Vijay > >>>> sony.vibh@gmail.com > >>>> wrote: > >>>> > Hi, > >>>> > I am using BaseX 6.5. I am trying to transform a given node > >>>> > using an > >>>> > XQuery. > >>>> > > >>>> > Say, I have an node like so: > >>>> > <entry xmlns="http://www.w3.org/2005/Atom" > >>>> > xmlns:libx="http://libx.org/xml/libx2%22%3E > >>>> > <id>1</id> > >>>> > <title>Link Amazon By ISBN</title> > >>>> > <updated>2010-09-29T18:37:48.592Z</updated> > >>>> > <author> > >>>> > <name>LibX Team</name> > >>>> > <uri>http://libx.org</uri> > >>>> > <email>libx.org@gmail.com</email> > >>>> > </author> > >>>> > <content type="html">Content created by LibX Libapp > >>>> > Builder</content> > >>>> > </entry> > >>>> > I am trying to send this node to an xquery which is expected
to
> >>>> > do the > >>>> > following actions: > >>>> > > >>>> > create a copy of this node (so that the actual node in the > >>>> > database > >>>> > does not > >>>> > change), > >>>> > transform/modify the duplicate copy of the given node > >>>> > return the modified duplicate copy of the given node > >>>> > > >>>> > I would expect the output to be like so: > >>>> > <entry xmlns="http://www.w3.org/2005/Atom" > >>>> > xmlns:libx="http://libx.org/xml/libx2%22%3E > >>>> > <id>1</id> > >>>> > <title>Link Amazon By ISBN</title> > >>>> > <updated>2010-09-29T18:37:48.592Z</updated> > >>>> > <author> > >>>> > <name>Sony</name> > >>>> > <uri>http://libx.org</uri> > >>>> > <email>libx.org@gmail.com</email> > >>>> > </author> > >>>> > <content type="html">Copy of: Content created by LibX
Libapp
> >>>> > Builder</content> > >>>> > </entry> > >>>> > I tried to perform the non-updating functions using transform > >>>> > and also > >>>> > tried > >>>> > to use a pending update list > >>>> > (Reference: http://docs.basex.org/wiki/Update#transform).
None
> >>>> > of this > >>>> > works > >>>> > as expected. Could you refer me to a more detailed > >>>> > documentation for > >>>> > performing such transform operations on nodes ? > >>>> > Thanks, > >>>> > Sony > >>>> > > >>>> > _______________________________________________ > >>>> > BaseX-Talk mailing list > >>>> > BaseX-Talk@mailman.uni-konstanz.de > >>>> > https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk > >>>> > > >>>> > > >>> > >>> > >>> _______________________________________________ > >>> BaseX-Talk mailing list > >>> BaseX-Talk@mailman.uni-konstanz.de > >>> https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk > >>> > >> > > > >