Mixing non-updating and updating expressions in a single query

Friday, 25 February 2011 · 1 message
SV
Sony Vijay25 Feb 2011 18:07 #
@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 at gmail.com>wrote:
Quoted text · 315 lines
> > 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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"> > >>>>>> >>>> <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 at 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 at 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"> > >>>>>> >>>> > <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 at 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"> > >>>>>> >>>> > <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 at 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 at mailman.uni-konstanz.de > >>>>>> >>>> > https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk > >>>>>> >>>> > > >>>>>> >>>> > > >>>>>> >>> > >>>>>> >>> > >>>>>> >>> _______________________________________________ > >>>>>> >>> BaseX-Talk mailing list > >>>>>> >>> BaseX-Talk at mailman.uni-konstanz.de > >>>>>> >>> https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk > >>>>>> >>> > >>>>>> >> > >>>>>> > > >>>>>> > > >>>>> > >>>> > >>> > >> > > > > >

⚡Generated with XQuery