|
Subject: Re: [xsl] An XPath expression that avoids writing special case code? From: "Wendell Piez wapiez@xxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Tue, 22 Jun 2021 13:59:07 -0000 |
Hey again,
Better:
<xsl:sequence select="$document/Row[Cell[1]/Data =
$element][not(Cell[2]/Data != $parent)]" />
Cheers, Wendell
On Tue, Jun 22, 2021 at 9:42 AM Wendell Piez <wapiez@xxxxxxxxxxxxxxx> wrote:
> Roger,
>
> Okay, so the requirement is that if Data[2] is present, it must correspond
> with the second argument. It may not be the same (if it is not there at
> all) but it must not be different.
>
> <xsl:function name="f:getRow">
> <xsl:param name="element"/>
> <xsl:param name="parent"/>
> <xsl:sequence select="$document/Row[Cell[1]/Data eq
> $element][not(Cell[2]/Data ne $parent)]" />
> </xsl:function>
>
> (Untested.)
>
> Does this reflect the intent?
>
> Cheers, Wendell
>
>
> On Fri, Jun 18, 2021 at 8:58 AM Roger L Costello costello@xxxxxxxxx <
> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
>> Hi Wendell,
>>
>> My XML document may have an element named navaid with a parent element
>> named airport and it may have an element named navaid with a parent element
>> named enrouteAirway, like this:
>>
>> <Document>
>> ...
>> <Row>
>> <Cell>
>> <Data>navaid</Data>
>> </Cell>
>> <Cell>
>> <Data>airport</Data>
>> </Cell>
>> </Row>
>> ...
>> <Row>
>> <Cell>
>> <Data>navaid</Data>
>> </Cell>
>> <Cell>
>> <Data>enrouteAirway</Data>
>> </Cell>
>> </Row>
>> ...
>> </Document>
>>
>> To identify that I want the navaid within airport (not the navaid within
>> enrouteAirway) I need to specify in the function call both element and
>> parent, e.g.,
>>
>> f:getRow('navaid', 'airport')
>>
>> Does that make sense?
>>
>> /Roger
>>
>> From: Wendell Piez wapiez@xxxxxxxxxxxxxxx <
>> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
>> Sent: Friday, June 18, 2021 8:45 AM
>> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
>> Subject: [EXT] Re: [xsl] An XPath expression that avoids writing special
>> casecode?
>>
>> Roger,
>>
>> I am fairly puzzled, not by the problem as posed, but whether it is
>> really the problem.
>>
>> Surely, if you had
>>
>> <xsl:function name="f:getRow">
>> <xsl:param name="element"/>
>> <xsl:sequence select="$document/Row[Cell[1]/Data eq $element]" />
>> </xsl:function>
>>
>> you could call
>>
>> <xsl:sequence select="f:getRow('airport')" />
>>
>> and not worry whether a parent is given or not.
>>
>> Mind you, I also agree with Mike Kay. I think this is a case where since
>> your syntax does not clearly reflect the semantics you wish to induce over
>> the data, everything becomes harder.
>>
>> So what's the real question here? My guess is it has to do with what a
>> "parent" is and why you want to look at it sometimes, but not other times.
>>
>> Cheers, Wendell
>>
>>
>> On Thu, Jun 17, 2021 at 10:06 AM Roger L Costello mailto:
>> costello@xxxxxxxxx <mailto: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
>>
>>
>>
>>
>> --
>> ...Wendell Piez... ...wendell -at- nist -dot- gov...
>> ...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org...
>> ...http://github.com/wendellpiez... ...gitlab.coko.foundation/wendell...
>> http://www.mulberrytech.com/xsl/xsl-list
>> http://lists.mulberrytech.com/unsub/xsl-list/673357 ()
>>
>>
>>
>
> --
> ...Wendell Piez... ...wendell -at- nist -dot- gov...
> ...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org...
> ...github.com/wendellpiez... ...gitlab.coko.foundation/wendell...
>
--
...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] An XPath expression that , Wendell Piez wapiez@ | Thread | Re: [xsl] An XPath expression that , Roger L Costello cos |
| Re: [xsl] An XPath expression that , Wendell Piez wapiez@ | Date | [xsl] Is XPath and/or XSLT designed, Roger L Costello cos |
| Month |