Subject: Re: [xsl] An XPath expression that avoids writing special case code? From: "Andre Cusson akhu01@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 18 Jun 2021 05:33:53 -0000 |
Hi Martin, I really like your solution. Short, elegant, and to the point. The empty element is part of every set. Changing a single character. A piece of beauty & smarts. Thank you. Cheers, ac Le jeu. 17 juin 2021 C 10:16, Michael Kay mike@xxxxxxxxxxxx < xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> a C)crit : > This is a case for pipelines. First run a transformation that turns your > document into something that better represents thet semantics, like > > <airports> > <airport>LHR</airport> > <airport>LAX</airport> > </airports> > > and then do your actual query against this document. > > This gives you separation of concerns, and the first transformation in the > pipeline is reusable code, you can use it regardless what query the second > stage needs to perform. > > When you're dealing with data that originates from spreadsheets, where you > often have to deal with complexities like rowspans and columnspans, this > pipeline approach is the only way to preserve your sanity. > > Michael Kay > Saxonica > > > On 17 Jun 2021, at 15:06, Roger L Costello costello@xxxxxxxxx < > xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > > > Hi Folks, > > > > My XML document contains a bunch of <Row> elements, like so: > > > > <Document> > > ... > > <Row> > > <Cell> > > <Data>airport</Data> > > </Cell> > > <Cell> > > <Data>airports</Data> > > </Cell> > > </Row> > > ... > > </Document> > > > > I want to fetch the Row whose Cell[1]/Data is 'airport' and whose > Cell[2]/Data is 'airports'. So I created this XPath expression: > > > > /Document/Row[Cell[1]/Data eq 'airport'][Cell[2]/Data eq 'airports'] > > > > I do this kind of fetching operation often, so I created a function to > fetch the desired Row: > > > > <xsl:function name="f:getRow"> > > <xsl:param name="element"/> > > <xsl:param name="parent"/> > > <xsl:sequence select="$document/Row[Cell[1]/Data eq > $element][Cell[2]/Data eq $parent]" /> > > </xsl:function> > > > > I call the function this way: > > > > <xsl:sequence select="f:getRow('airport', 'airports')" /> > > > > Sometimes there is an element that doesn't have a parent. That is, > sometimes I'd like to fetch a Row in which Cell[2] is empty, like this: > > > > <Row> > > <Cell> > > <Data>aviation</Data> > > </Cell> > > <Cell/> > > </Row> > > > > Then this call to f:getRow fails: > > > > <xsl:sequence select="f:getRow('aviation', '')" /> <!-- Those are > two apostrophes within the parentheses --> > > > > Clearly I need to modify f:getRow. I could add special case code to test > $parent to see if it is empty (the '' string) and do one thing, and if it's > not empty do another thing. But I wonder if there is a more elegant > solution that doesn't involve special case code? Is there a way to modify > the XPath expression in f:getRow such that it fetches the correct Row > regardless of whether $parent is empty or not? > > > > /Roger
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] An XPath expression that , Michael Kay mike@xxx | Thread | Re: [xsl] An XPath expression that , Mukul Gandhi mukulg@ |
Re: [xsl] An XPath expression that , Michael Kay mike@xxx | Date | Re: [xsl] An XPath expression that , Mukul Gandhi mukulg@ |
Month |