user2658628
user2658628

Reputation: 35

Need XPath and XQuery query

I'm working on Xpath/Xquery to return values of multiple child nodes based on a sibling node value in a single query. My XML looks like this

<FilterResults>
        <FilterResult>
            <ID>535</ID>
            <Analysis>
                <Name>ZZZZ</Name>
                <Identifier>asdfg</Identifier>
                <Result>High</Result>
                <Score>0</Score>
            </Analysis>
            <Analysis>
                <Name>XXXX</Name>
                <Identifier>qwerty</Identifier>
                <Result>Medium</Result>
                <Score>0</Score>
            </Analysis>
        </FilterResult>
        <FilterResult>
            <ID>745</ID>
            <Analysis>
                <Name>XXXX</Name>
                <Identifier>xyz</Identifier>
                <Result>Critical</Result>
                <Score>0</Score>
            </Analysis>
            <Analysis>
                <Name>YYYY</Name>
                <Identifier>qwerty</Identifier>
                <Result>Medium</Result>
                <Score>0</Score>
            </Analysis>
        </FilterResult>
</FilterResults>

I need to get values of Score and Identifier based on Name value. I'm currently trying with below query but not working as desired

fn:string-join((
  for $Identifier in fn:distinct-values(FilterResults/FilterResult/Analysis[Name="XXXX"]) 
  return fn:string-join((//Identifier,//Score),'-')),',')

The output i'm looking for is this

qwerty-0,xyz-0

Upvotes: 0

Views: 50

Answers (1)

wst
wst

Reputation: 11771

Your question suggests some fundamental misunderstandings about XQuery, generally. It's hard to explain everything in a single answer, but 1) that is not how distinct-values works (it returns string values, not nodes), and 2) the double slash selections in your return statement are returning everything because they are not constrained by anything. The XPath you use inside the distinct-values call is very close, however.

Instead of calling distinct-values, you can assign the Analysis results of that XPath to a variable, iterate over them, and generate concatenated strings. Then use string-join to comma separate the full sequence. Note that in the return statement, the variable $a is used to concat only one pair of values at a time.

string-join(
  let $analyses := FilterResults/FilterResult/Analysis[Name="XXXX"]
  for $a in $analyses
  return $a/concat(Identifier, '-', Score),
  ',')

=> qwerty-0,xyz-0

Upvotes: 1

Related Questions