Hi Randy,
Index-of will return you the position of an item in a sequence.
Your position predicate, on the other hand, refers to the position with respect
to document order. So, considering the following:
let $doc :=
<doc>
<foo>
<value>cat</value>
<value>dog</value>
</foo>
<bar>
<value>cat</value>
<value>dog</value>
</bar>
</doc>
return
xdmp:path($doc//value)
-->
/doc/foo/value[1]
/doc/foo/value[2]
/doc/bar/value[1]
/doc/bar/value[2]
That hopefully clears up why your code wasn't doing what you were hoping it
would do.
You could filter for only the 5 values you want by doing something like:
for $match in
$song-doc//ts:Value[cts:contains(.,("cat","dog","mouse","aye-aye","elephant"))]
return <div class="abc">Interesting Match: {$match/text()}</div>
Any closer?
Kelly
Message: 2
Date: Wed, 11 May 2011 11:41:11 -0500
From: Randy Smith <[email protected]>
Subject: Re: [MarkLogic Dev General] How To Get The "Content" of An
Index?
To: General MarkLogic Developer Discussion
<[email protected]>
Message-ID: <[email protected]>
Content-Type: text/plain; charset="iso-8859-1"
Geert & Others,
Thanks for the input!
I thought maybe you had given me the solution but still having problems.
*The situation is like this:*
1. I'm new to these murky waters. :-)
2. I'm thinking this is generally a straight forward problem except for the
following wrinkle that I was trying to solve without a serious code
rewrite:
3. I have ~20,000 documents where almost all have unique element names that are
great for faceting like e.g. "ResponsibleParty", "Date", etc...
I set up my range indexes for them and things work great.
However, one of the elements I'm interested in i.e. "Value" can appear up
to ~1500+ times in a single document and have *_different _*content *_each
time_*. Turns out I am only interested in about 5 possible content (character
strings) that appear in the element "Value".
4. I use:
*{if { fn:contains(fn:string-join(($song-doc//ts:Value), "" , "", "Cat"))
then /<div class="abc"> Value Cat: {
/fn:string-join(($song-doc//ts:Value), "" , ""/</div>/**
else()}*
to determine if "cat" is present in any of the 1500 content values and if it
is, display them. *This works great except it outputs _all_of them to the
browser*. ??
I can also find the position in "Value" were "cat" is found using
{if {$song-doc//ts:Value[.= 'Cat'])
then let $x := fn:index-of ($song-doc//ts:Value, 'Cat')
But when I us the index (i.e. $x) and add this:
/return/
/{<div class="abc"> Content of "Value" at "cat" + 1 =
{//$song-doc//ts:Value[position() =($x + 1)]}</div>/}
this does not work. It returns nothing.
I found out today when trying different things that if I put the integer
"1" in place of ($x+1) it, again, returns ALL of the "Value" strings.
However, anything other than "1" returns nothing. ???? Not sure why.
5. You can see I'm dancing around the solution but it still escapes me. :-)
6. Maybe you can't get there from here, but I seems close.
7. The suggestion to create an "document" just for the content of
"Value" sounds good, but I do not know how to proceed to do that given
my newness.
8. I also thought about filtering the "Value" element in the xml data as
it comes in but we would like ALL of the data to be present for data mining.
9. I think I need council in the form of a teacher! :-)
Again, thanks for the help,
Randy
_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general