I think this error depends on the context of the two expressions you've
given below - which in and of themselves look fine.
In an expression context, you need a comma between two direct element
constructors:
<a/>, <b/>
When directly inside another direct element constructor, no comma is
necessary (because the syntax is emulating XML itself):
<root><a/><b/></root>
When you use curly braces inside a direct element constructor, you
return to an expression context, so commas are necessary again:
<root>{ <a/>, <b/> }</root>
You can mix the two styles:
<root>{ <a/>, <b/> }<c/><d/></root>
John
On 04/09/12 10:58, Mailing Lists Mail wrote:
Here is what Stumps me about the braces.. Since JOhn's solution worked,
I wanted to do the same for other element lengths...
so I did
<short-desc>{
sum(
for $shrtdesc in $ltnfiles//subtopic[@id = 'DEF']//short-definition
return string-length($shrtdesc/p/__text)
)
}</short-desc>
<long-desc>{
sum(
for $shrtdesc in $ltnfiles//subtopic[@id = 'DEF']//long-definition
return string-length($shrtdesc/p/__text)
)
}</long-desc>
Ended up getting the following error...
At line 24 column 3:
22.
23. <long-desc>
24. {
25. sum(
26.
ANy Ideas please?
On Tue, Sep 4, 2012 at 10:37 AM, John Snelson
<[email protected] <mailto:[email protected]>> wrote:
You're close - the missing part is that you want to use the sum()
function, ie:
<short-desc>{
sum(
for $shrtdesc in $ltnfiles//subtopic[@id = 'DEF']//short-definition
return string-length($shrtdesc/p/__text)
)
}</short-desc>
John
On 04/09/12 10:15, Mailing Lists Mail wrote:
Dear Xquery Adults,
I am very new here.. I have some issues with getting my requirements
working.. I guess, this should be very simple, but dont seem to
get my
heads around... THe following is what I want..
I have loads of XMLs in the Data Store ( markLogic)
I have to run a query to do the return the string lengths of certain
elements from 100 XMLs./
So my pseudo code will be :
<results>
For all XMLs in the Data store
{
<file filename = "filename of the current file ">
<desc> {length of desc at //xx/y/desc }
<!--
There could be more than one desc, in which case, i would
like the
sum of all the string lengths of each desc
-->
</desc>
<short-desc>
{
string-length ( //xx//yy/short-desc)
}
</short-desc>
</file>
</results>
My attempts:
declare namespace dict =
"http://www.lexis-nexis.com/__glp/dict
<http://www.lexis-nexis.com/glp/dict>";
for $ltnfiles in doc()
let $NAME:= document-uri($ltnfiles)
return (
<ltn >
<name>
{$NAME}
</name>
<short-desc>
{string-length(string($__ltnfiles//subtopic[@id =
'DEF']/short-definition/p/__text))}
</short-desc>
</ltn>
)
THe above works fine, if there is only one short-definition..
FOr more
than one shortdefiitions, it comes up with the error message
obviously
because the string does not allow 2 arguments, while the stuff
passed
into the function is a sequence...
How do I do another loop inside the first one, for each
short-defiitin
... SOmething like :
for $ltnfiles in doc()
let $NAME:= document-uri($ltnfiles)
return (
<ltn >
<name>
{$NAME}
</name>
{
for $shrtdesc in $ltnfiles//subtopic[@id =
'DEF']//short-definition
<short-desc>
{
string-length( $shrtdesc/p/text)
}
</short-desc>
}
</ltn>
)
DOEstNT WORK .. :( This wont give me what I want as What I
want is a
sum (string-lengths of all the short-def) .. But atleast i thought i
would get something like
<short-desc>100</short-desc>
<short-desc>344</short-desc>
( I would have liked <short-desc>444</short-desc> )
ANy help would be highly appreciated ..
Thanks
Dak.
--
John Snelson, Lead Engineer http://twitter.com/jpcs
MarkLogic Corporation http://www.marklogic.com
_________________________________________________
[email protected] <mailto:[email protected]>
http://x-query.com/mailman/__listinfo/talk
<http://x-query.com/mailman/listinfo/talk>
--
John Snelson, Lead Engineer http://twitter.com/jpcs
MarkLogic Corporation http://www.marklogic.com
_______________________________________________
[email protected]
http://x-query.com/mailman/listinfo/talk