Re: [xsl] XPath expression to convert XSD enumerations into a regex, longest value first

Subject: Re: [xsl] XPath expression to convert XSD enumerations into a regex, longest value first
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 8 Jul 2022 05:01:34 -0000
Surely sorting by log(N) gives the same result as sorting by N?

At this point we're stuck because the requirements aren't clear. In the
example, 12 appeared in the output before 11, but we don't know why: there was
nothing in the requirements statement that said it should.

Michael Kay
Saxonica

> On 8 Jul 2022, at 03:48, Dimitre Novatchev dnovatchev@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> > string-join(
> >                     sort(/*/xs:restriction/xs:enumeration/@value,
> >                            (),
>  >                          function($s) {-
Q{http://www.w3.org/2005/xpath-functions/math}log10($s)
<http://www.w3.org/2005/xpath-functions/math%7Dlog10($s)>}) ,
>  >                   '|'
>  >                )
> >
> >   This produces exactly the wanted result. Note: no reverse(), no
for/return :
> >
> >   12|11|10|9|8|7|6|5|4|3|2|1
>
> And why not simply:
>
> string-join(
>                   sort(/*/xs:restriction/xs:enumeration/@value,
>                          (),
>                           function($n) {- $n)}) ,
>                    '|'
>                  )
>
> Obviously, the reverse sort puts the longest numbers first. One needn't be
misled by a requirement such as: "the longest value (not the biggest value,
the string longest value) is listed first".
> And if the enumeration's value space is not xs:integer as provided in the
original question, but can be any string, then simply:
>
> string-join(
>                   sort(/*/xs:restriction/xs:enumeration/@value,
>                          (),
>                           function($s) {- string-length($s))}) ,
>                    '|'
>                  )
>
>
>
>
> On Thu, Jul 7, 2022 at 7:28 PM Dimitre Novatchev dnovatchev@xxxxxxxxx
<mailto:dnovatchev@xxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx
<mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>> wrote:
>
>
> On Thu, Jul 7, 2022 at 6:57 PM Dimitre Novatchev dnovatchev@xxxxxxxxx
<mailto:dnovatchev@xxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx
<mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>> wrote:
> Hi Roger,
>
> > Well, I devised a solution, but it sure ain't simple.
> >
> >   string-join(for $i in reverse(sort(xs:restriction/xs:enumeration, (),
function($enum) {string-length($enum/@value )})) return $i/@value, '|')
> >
> >   Is there is a simpler XPath expression to solve this problem?
>
> I think this can be written in a good and readable way as below:
>
> string-join(
>                   sort(/*/xs:restriction/xs:enumeration/@value,
>                          (),
>                           function($s) {- string-length($s)}) ,
>                    '|'
>                  )
>
>
> The above produces:
> 10|11|12|1|2|3|4|5|6|7|8|9
>
>
> In case it is necessary the values to be in reverse order, I would use what
I think is probably the best, simplest and most direct solution (it's a pity
there is no default prefix for the "math" namespace):
>
> string-join(
>                   sort(/*/xs:restriction/xs:enumeration/@value,
>                          (),
>                           function($s) {-
Q{http://www.w3.org/2005/xpath-functions/math}log10($s)
<http://www.w3.org/2005/xpath-functions/math%7Dlog10($s)>}) ,
>                    '|'
>                  )
>
> This produces exactly the wanted result. Note: no reverse(), no for/return
:
>
> 12|11|10|9|8|7|6|5|4|3|2|1
>
> Thanks,
> Dimitre
>
> On Thu, Jul 7, 2022 at 10:02 AM Roger L Costello costello@xxxxxxxxx
<mailto:costello@xxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx
<mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>> wrote:
> Hi Folks,
>
> I have an XSD simpleType with enumeration values:
>
> <xsd:simpleType name="RunwayLightingType">
>   <xsd:restriction base="xsd:string">
>    <xsd:enumeration value="1"/>
>    <xsd:enumeration value="2"/>
>    <xsd:enumeration value="3"/>
>    <xsd:enumeration value="4"/>
>    <xsd:enumeration value="5"/>
>    <xsd:enumeration value="6"/>
>    <xsd:enumeration value="7"/>
>    <xsd:enumeration value="8"/>
>    <xsd:enumeration value="9"/>
>    <xsd:enumeration value="10"/>
>    <xsd:enumeration value="11"/>
>    <xsd:enumeration value="12"/>
>   </xsd:restriction>
>  </xsd:simpleType>
>
> I want to turn the values into a regex such that the longest value (not the
biggest value, the string longest value) is listed first:
>
> 12|11|10|9|8|7|6|5|4|3|2|1
>
> Seems like a simple problem, right? Should have a simple solution, right?
>
> Well, I devised a solution, but it sure ain't simple.
>
> string-join(for $i in reverse(sort(xs:restriction/xs:enumeration, (),
function($enum) {string-length($enum/@value )})) return $i/@value, '|')
>
> Is there is a simpler XPath expression 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/782854> (by
email <>)
>
>
> --
> Cheers,
> Dimitre Novatchev
> ---------------------------------------
> Truly great madness cannot be achieved without significant intelligence.
> ---------------------------------------
> To invent, you need a good imagination and a pile of junk
> -------------------------------------
> Never fight an inanimate object
> -------------------------------------
> To avoid situations in which you might make mistakes may be the
> biggest mistake of all
> ------------------------------------
> Quality means doing it right when no one is looking.
> -------------------------------------
> You've achieved success in your field when you don't know whether what
you're doing is work or play
> -------------------------------------
> To achieve the impossible dream, try going to sleep.
> -------------------------------------
> Facts do not cease to exist because they are ignored.
> -------------------------------------
> Typing monkeys will write all Shakespeare's works in 200yrs.Will they write
all patents, too? :)
> -------------------------------------
> Sanity is madness put to good use.
> -------------------------------------
> I finally figured out the only reason to be alive is to enjoy it.
>
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/782854> (by
email <applewebdata://2C24E57C-EE00-4AEE-AAF1-E549D37BCEC0>)
>
>
> --
> Cheers,
> Dimitre Novatchev
> ---------------------------------------
> Truly great madness cannot be achieved without significant intelligence.
> ---------------------------------------
> To invent, you need a good imagination and a pile of junk
> -------------------------------------
> Never fight an inanimate object
> -------------------------------------
> To avoid situations in which you might make mistakes may be the
> biggest mistake of all
> ------------------------------------
> Quality means doing it right when no one is looking.
> -------------------------------------
> You've achieved success in your field when you don't know whether what
you're doing is work or play
> -------------------------------------
> To achieve the impossible dream, try going to sleep.
> -------------------------------------
> Facts do not cease to exist because they are ignored.
> -------------------------------------
> Typing monkeys will write all Shakespeare's works in 200yrs.Will they write
all patents, too? :)
> -------------------------------------
> Sanity is madness put to good use.
> -------------------------------------
> I finally figured out the only reason to be alive is to enjoy it.
>
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by
email <>)

Current Thread