Re: [xsl] Need an elegant (succinct) XPath expression to decode a 3-character field

Subject: Re: [xsl] Need an elegant (succinct) XPath expression to decode a 3-character field
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 26 Jan 2024 15:22:53 -0000
I would suggest

if (starts-with(RNP, '0'))
then xs:double(replace(RNP, '(..)(.)', '$1e-$2') => xs:decimal => round(1)
else xs:integer(RNP) div 10

Michael Kay

> On 26 Jan 2024, at 15:01, Roger L Costello costello@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hi Folks,
>
> My XML document contains an element named RNP (Required Navigation
Performance, which is the required performance of an aircraft, measured in
nautical miles).
>
> Its value is three digits, e.g.,
>
> <RNP>152</RNP>
>
> The value is encoded. I need an XPath expression which decodes it.
>
> If the first digit is non-zero, then the decoding is: the first two digits,
decimal point, the last digit.
>
> In the example above, the first digit is 1, so it is decoded to 15.2
>
> 152 -> decode -> 15.2
>
> (the aircraft's required performance is 15.2 NM).
>
> If the first digit is zero, then the decoding is: the third digit represents
the number of places to the right of the decimal point, e.g.,
>
> 010 -> decode -> 1
> 011 -> decode -> 0.1
> 012 -> decode -> 0.01
> 013 -> decode -> 0.001
> 014 -> decode -> 0.0001
> 015 -> decode -> 0.00001
> 016 -> decode -> 0.000001
> 017 -> decode -> 0.0000001
> 018 -> decode -> 0.00000001
> 019 -> decode -> 0.000000001
>
> I created an XPath expression which seems to do the decoding correctly. See
below. It is an awful, brute force solution. Is there an elegant (succinct)
solution?
>
> if (substring(RNP,1,1) ne '0') then
concat(substring(RNP,1,2),'.',substring(RNP,3,1))
> else if (substring(RNP,1,1) eq '0') then
>           if (substring(RNP,3,1) eq '0') then substring(RNP,2,1)
>           else if (substring(RNP,3,1) eq '1') then
concat('0.',substring(RNP,2,1))
>           else if (substring(RNP,3,1) eq '2') then
concat('0.0',substring(RNP,2,1))
>           else if (substring(RNP,3,1) eq '3') then
concat('0.00',substring(RNP,2,1))
>           else if (substring(RNP,3,1) eq '4') then
concat('0.000',substring(RNP,2,1))
>           else if (substring(RNP,3,1) eq '5') then
concat('0.0000',substring(RNP,2,1))
>           else if (substring(RNP,3,1) eq '6') then
concat('0.00000',substring(RNP,2,1))
>           else if (substring(RNP,3,1) eq '7') then
concat('0.000000',substring(RNP,2,1))
>           else if (substring(RNP,3,1) eq '8') then
concat('0.0000000',substring(RNP,2,1))
>           else concat('0.00000000',substring(RNP,2,1))
>      else ''

Current Thread