|
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:42:55 -0000 |
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...
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] An XPath expression that , Roger L Costello cos | Thread | Re: [xsl] An XPath expression that , Wendell Piez wapiez@ |
| Re: [xsl] user-defined XSLT functio, Graydon graydon@xxxx | Date | Re: [xsl] An XPath expression that , Wendell Piez wapiez@ |
| Month |