Re: [xsl] Find the number of elements that are prior to the series of elements that match a string?

Subject: Re: [xsl] Find the number of elements that are prior to the series of elements that match a string?
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 12 Mar 2019 18:01:21 -0000
My instinct is to use index-of() to get the positions of the elements that
match the first required byte, and then for each of these positions, form the
string of N bytes starting at this position and do a string comparison to test
whether there is a match at this position.

let $candidates := index-of(/Bytes/Byte, substring($req, 1, 2))
return $candidates[string-join(subsequence(/Bytes/Byte, ., $len), '') eq
$req][1] - 1

Michael Kay
Saxoniica



> On 12 Mar 2019, at 17:35, Costello, Roger L. costello@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hi Folks,
>
> I have an XML document containing a long list of Byte elements, e.g.,
>
> <Bytes>
>    <Byte hexAddress="0">4D</Byte>
>    <Byte hexAddress="1">5A</Byte>
>    <Byte hexAddress="2">90</Byte>
>    <Byte hexAddress="3">00</Byte>
>    <Byte hexAddress="4">03</Byte>
>    <Byte hexAddress="5">00</Byte>
>    <Byte hexAddress="6">00</Byte>
>    <Byte hexAddress="7">00</Byte>
>    <Byte hexAddress="8">04</Byte>
>    <Byte hexAddress="9">00</Byte>
>    <Byte hexAddress="A">00</Byte>
>    <Byte hexAddress="B">00</Byte>
>    <Byte hexAddress="C">FF</Byte>
>    <Byte hexAddress="D">FF</Byte>
>    ...
> </Bytes>
>
> I have a string of hex values, e.g.,
>
> 04000000FF
>
> You can see that the string is contained within this series of Byte
elements:
>
>    <Byte hexAddress="8">04</Byte>
>    <Byte hexAddress="9">00</Byte>
>    <Byte hexAddress="A">00</Byte>
>    <Byte hexAddress="B">00</Byte>
>    <Byte hexAddress="C">FF</Byte>
>
> I want to find the number of <Byte> elements that occur prior to the series
of Byte elements.
>
> I figured one approach is to convert all the Byte text node values into a
string and then perform string manipulations:
>
> string-length(substring-before(string-join(/Bytes/Byte/text(), ''),
'04000000FF')) idiv 2
>
> Note: I divided by two because each Byte has 2 digits.
>
> That seems to work, but I suspect it is horribly inefficient because it
creates a string containing all the Byte text node values and there may be
tens or hundreds of thousands of Byte elements.
>
> What is an efficient way to solve this problem?
>
> /Roger

Current Thread