xsl-list
[Top] [All Lists]

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

2019-03-12 14:20:54
I was thinking of doing something with looking up the individual byte() 
elements using key() on the string values but I couldn't think of an elegant 
way to split the input string into two-character chunks. But I'm sure there's a 
clever XPath 3 way to do it that I'm just not seeing. Easy to do with a 
recursive function or xsl:iterator or analyze-string but I suspect there's a 
more succinct way to do it.

So what is the easiest/clearest/most-clever way in XPath 3 to break a string of 
arbitrary length into a sequence of strings of a fixed size?

Cheers,

E.
--
Eliot Kimber
http://contrext.com
 

On 3/12/19, 2:02 PM, "Costello, Roger L. costello(_at_)mitre(_dot_)org" 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:

    Michael Kay wrote:
    
    > let $candidates := index-of(/Bytes/Byte, substring($req, 1, 2)) return 
$candidates[string-
    > join(subsequence(/Bytes/Byte, ., $len), '') eq $req][1] - 1
    
    Wow!
    
    That is mind-blowing! 
    
    Thank you Michael!
    
    /Roger
    
    
    > On 12 Mar 2019, at 17:35, Costello, Roger L. 
costello(_at_)mitre(_dot_)org 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> 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
    > 
    > 
    > 
    > 
    
    
    
--~----------------------------------------------------------------
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
--~--

<Prev in Thread] Current Thread [Next in Thread>