Hi Michael,
That XPath expression yields the empty set.
I created these variables:
<xsl:variable name="first-group" select="$groups[1]" />
<xsl:variable name="Foo-row-first-group" select="($first-group?*)/row[Data eq
'Foo']"/>
And then output the value of the second variable:
<Foo-row-in-first-group>
<xsl:sequence select="$Foo-row-first-group" />
</Foo-row-in-first-group>
This is the output:
<Foo-row-in-first-group/>
Why does the XPath yield the empty set? Clearly the first group contains a
<row> element with a <Data> element with value 'Foo'. Thoughts?
/Roger
From: Michael Kay mike(_at_)saxonica(_dot_)com
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com>
Sent: Thursday, June 6, 2019 10:47 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [EXT] Re: [xsl] Each value in an XPath array is a sequence of
elements... how to access a particular element in a particular array value?
$first_group is an array of nodes. To turn it into a sequence of nodes, use
"?*". So it's
($first_group?*)/row
(parentheses because I don't have the operator precedences in my head)
Michael Kay
Saxonica
On 6 Jun 2019, at 15:26, Costello, Roger L.
mailto:costello(_at_)mitre(_dot_)org
<mailto:xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:
Hi Folks,
This is an extension to a question that I had last week ...
Recall that I want to group the <row> elements in the following XML. Each group
should consist of those <row> elements that have the same ARPT__IDENT,
TRM__IDENT values.
<Test>
<row>
<ARPT__IDENT>A</ARPT__IDENT>
<TRM__IDENT>X</TRM__IDENT>
<Data>Foo</Data>
</row>
<row>
<ARPT__IDENT>A</ARPT__IDENT>
<TRM__IDENT>X</TRM__IDENT>
<Data>Bar</Data>
</row>
<row>
<ARPT__IDENT>A</ARPT__IDENT>
<TRM__IDENT>Y</TRM__IDENT>
<Data>Blah</Data>
</row>
<row>
<ARPT__IDENT>A</ARPT__IDENT>
<TRM__IDENT>Y</TRM__IDENT>
<Data>Plugh</Data>
</row>
</Test>
That XML consists of two groups. Each group has two <row> elements.
Martin provided a great XPath 3.1 expression for doing the grouping:
<xsl:variable name="groups" as="array(element(row))*" select="
let $keys :=
distinct-values($rows/concat(ARPT__IDENT, '|', TRM__IDENT))
return
for $i in $keys
return
array {$rows[$i = concat(ARPT__IDENT, '|', TRM__IDENT)] }
"/>
In the following, I select the first group:
<xsl:variable name="first-group" select="$groups[1]" />
Next, I want to select the <row> element in the first group that has Foo as the
value of the <Data> element. I thought that this would be the appropriate XPath
expression:
<xsl:variable name="Foo-row-first-group" select="$first-group/row[Data eq
'Foo']"/>
Apparently it is not the appropriate XPath expression, because I get this error
message:
Axis step child::element(Q{}row) cannot
be used here: the context item is not a node
What is the appropriate XPath expression, please?
/Roger
http://www.mulberrytech.com/xsl/xsl-list
http://lists.mulberrytech.com/unsub/xsl-list/673357 ()
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--