Subject: Re: [xsl] Seek XPath 2.0 expression for this: Are there any book titles with more than one binding? From: "Alan Painter alan.painter@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sat, 4 May 2019 06:39:48 -0000 |
Taking Wendell's understanding of the required solution, can do with nested for-each-group although rather rebarbative: <xsl:template match="/"> <BooksWithMultipleBindings> <xsl:for-each-group select="/Bookstore/BookTitle/Book" group-by= "Author" > <xsl:for-each-group select="current-group()" group-by= "Title"> <xsl:for-each-group select="current-group()" group-by= "Binding"> <xsl:sequence select="current-group()[1]" /> </xsl:for-each-group> </xsl:for-each-group> </xsl:for-each-group> </BooksWithMultipleBindings> </xsl:template> Other option is with Wendell's signature function and a single for-each-group: <xsl:template match="/"> <BooksWithMultipleBindings> <xsl:for-each-group select="/Bookstore/BookTitle/Book" group-by= "l:signature(.)" > <xsl:sequence select="current-group()[1]" /> </xsl:for-each-group> </BooksWithMultipleBindings> </xsl:template> We'll need to improve the signature function to be sure that the key is distinct, as the following distinct book-author pairs would produce the same key with the function as proposed. <Book> <Author>Cher</Author> <Title>Ami_Chanteur</Title> <Binding>softcover</Binding> <Count>1</Count> <Description>do do do ..</Description> </Book> <Book> <Author>Cher_Ami</Author> <Title>Chanteur</Title> <Binding>softcover</Binding> <Count>1</Count> <Description>do do do ..</Description> </Book> </BookTitle> As an example, I'm thinking that the following function should be distinct for all possible values: <xsl:function name="l:signature" as="xs:string"> <xsl:param name="book" as="element(Book)"/> <xsl:value-of select="concat('Author:', $book/Author, string-length($book/Author), 'Title:', $book/Title, string-length($book/Title), 'Binding:', $book/Binding)"/> </xsl:function> best regards On Sat, May 4, 2019 at 1:52 AM Wendell Piez wapiez@xxxxxxxxxxxxxxx < xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > As long as we are offering alternatives, how about XSLT? > > <xsl:key name="bound-books" match="Book" > use="l:signature(.)"/> > > <xsl:template match="/"> > <BookList> > <xsl:apply-templates select=".//Book"/> > </BookList> > </xsl:template> > > <xsl:template match="Book"/> > > <xsl:template match="Book[. is key('bound-books',l:signature(.))[1] > and exists(key('bound-books',l:signature(.))[2])]"> > <xsl:copy-of select="."/> > </xsl:template> > > <xsl:function name="l:signature" as="xs:string"> > <xsl:param name="book" as="element(Book)"/> > <xsl:value-of select="string-join($book/(Author,Title,Binding),'_')"/> > </xsl:function> > > This might translate the requirements even more directly -- drop a > book unless it is the first with its title, author and binding and if > a second of the same title, author and binding can be found. > > I *think* that is what was asked for, or the practical equivalent? > > Cheers, Wendell > > > On Thu, May 2, 2019 at 12:21 PM Dimitre Novatchev dnovatchev@xxxxxxxxx > <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > > > Assuming that there is just one BookBinding for all books with the same > title by the same author and with the same binding, and also assuming that > all books with the same title by the same author are in ** contiguous** > bindings (which is the case with the provided document), then this XPath > 2.0 expression selects the wanted Book elements. At least for me it seems > less complex and more understandable than the originally provided expression > > > > "for $b in > > /*/*/Book[Author = ../following-sibling::*[1]/Book/Author > > and Title = ../following-sibling::*[1]/Book/Title > > and not(Binding = > ../following-sibling::*[1]/Book/Binding) > > ][1], > > $binding in distinct-values(/*/*/Book[Author = $b/Author and > Title = $b/Title]/Binding) > > return > > /*/*/Book[Author = $b/Author and Title = $b/Title and Binding > = $binding][1] > > > > > > On Thu, May 2, 2019 at 5:55 AM Costello, Roger L. costello@xxxxxxxxx < > xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > >> > >> Hello XPath experts! > >> > >> At the bottom of this message is my XML document. I need an XPath 2.0 > expression that returns the result of this query: > >> > >> Are there any book titles with more than > >> one binding? If yes, then show the first book > >> for each binding. > >> > >> For the below XML document, the query should return these two books: > >> > >> <Book> > >> <Author>Sally Smith</Author> > >> <Title>XYZ</Title> > >> <Binding>hardcover</Binding> > >> <Count>1</Count> > >> <Description>lo lo lo ..</Description> > >> </Book> > >> <Book> > >> <Author>Sally Smith</Author> > >> <Title>XYZ</Title> > >> <Binding>softcover</Binding> > >> <Count>1</Count> > >> <Description>do do do ..</Description> > >> </Book> > >> > >> Notice that the two books have the same author and title but different > binding (hardcover versus softcover). > >> > >> This XPath 2.0 expression seems to work: > >> > >> for $i in /Bookstore/BookTitle/Book[1], > >> $j in /Bookstore/BookTitle/Book[1] return > >> if (($i ne $j) > >> and ($i/Author eq $j/Author) > >> and ($i/Title eq $j/Title) > >> and ($i/Binding ne $j/Binding) > >> and ($i = $j/preceding::Book)) > >> then ($i, $j) > >> else () > >> > >> That expression seems awfully complicated. Is there a simpler > expression? If there isn't a simpler expression, then do you see anything > missing in the expression (i.e., something that the expression doesn't take > into consideration)? /Roger > >> > >> <Bookstore> > >> <BookTitle> > >> <Book> > >> <Author>John Doe</Author> > >> <Title>ABC</Title> > >> <Binding>hardcover</Binding> > >> <Count>1</Count> > >> <Description>da da da ..</Description> > >> </Book> > >> <Book> > >> <Author>John Doe</Author> > >> <Title>ABC</Title> > >> <Binding>hardcover</Binding> > >> <Count>2</Count> > >> <Description>za za za ..</Description> > >> </Book> > >> </BookTitle> > >> <BookTitle> > >> <Book> > >> <Author>John Doe</Author> > >> <Title>Foo</Title> > >> <Binding>softcover</Binding> > >> <Count>1</Count> > >> <Description>na na na ..</Description> > >> </Book> > >> </BookTitle> > >> <BookTitle> > >> <Book> > >> <Author>Sally Smith</Author> > >> <Title>XYZ</Title> > >> <Binding>hardcover</Binding> > >> <Count>1</Count> > >> <Description>lo lo lo ..</Description> > >> </Book> > >> <Book> > >> <Author>Sally Smith</Author> > >> <Title>XYZ</Title> > >> <Binding>hardcover</Binding> > >> <Count>2</Count> > >> <Description>ho ho ho ..</Description> > >> </Book> > >> </BookTitle> > >> <BookTitle> > >> <Book> > >> <Author>Sally Smith</Author> > >> <Title>XYZ</Title> > >> <Binding>softcover</Binding> > >> <Count>1</Count> > >> <Description>do do do ..</Description> > >> </Book> > >> </BookTitle> > >> </Bookstore> > >> > > > > > > -- > > 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 > > EasyUnsubscribe (by email) > > > > -- > ...Wendell Piez... ...wendell -at- nist -dot- gov... > ...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org... > ...github.com/wendellpiez... ...gitlab.coko.foundation/wendell...
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Seek XPath 2.0 expression, Wendell Piez wapiez@ | Thread | Re: [xsl] Seek XPath 2.0 expression, Dimitre Novatchev dn |
Re: [xsl] Seek XPath 2.0 expression, Dimitre Novatchev dn | Date | Re: [xsl] Keeping result-document(), Dan Vint dvint@xxxxx |
Month |