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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Need an elegant (succinct, Martin Honnen martin | Thread | Re: [xsl] Need an elegant (succinct, Norm Tovey-Walsh ndw |
Re: [xsl] Need an elegant (succinct, Martin Honnen martin | Date | Re: [xsl] Need an elegant (succinct, Norm Tovey-Walsh ndw |
Month |