|
Subject: Re: [xsl] Seek XPath 2.0 expression for this: Are there any book titles with more than one binding? From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sat, 4 May 2019 06:31:29 -0000 |
Or even this:
/*/BookTitle/Book
[index-of(/*/BookTitle/Book[1]/concat(Author,
'|',Title),
concat(Author, '|', Title)
)[2]
> 0
][1]"/>
which is more readable as:
/*/BookTitle/Book[index-of($vallAuthorTitle, concat(Author, '|', Title))[2]
> 0][1]
if we substitute $vallAuthorTitle for:
/*/BookTitle/Book[1]/concat(Author, '|',Title)
Certainly, if Xpath 3 were allowed, then one could use a "let" expression
for this substitution -- and then other, better solutions would be possible
using the simple mapping operator "!" and/or maps.
Something more about the technique used in these expressions can be found
here:
https://dnovatchev.wordpress.com/2008/11/16/xpath-2-0-gems-find-all-duplicate-values-in-a-sequence-part-2/
Cheers,
Dimitre
On Thu, May 2, 2019 at 9:20 AM Dimitre Novatchev <dnovatchev@xxxxxxxxx>
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>
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Seek XPath 2.0 expression, Alan Painter alan.pa | Thread | Re: [xsl] Keeping result-document(), Dan Vint dvint@xxxxx |
| Re: [xsl] Seek XPath 2.0 expression, Wendell Piez wapiez@ | Date | Re: [xsl] Seek XPath 2.0 expression, Alan Painter alan.pa |
| Month |