Re: [xsl] An XPath expression that avoids writing special case code?

Subject: Re: [xsl] An XPath expression that avoids writing special case code?
From: "Roger L Costello costello@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 18 Jun 2021 12:57:39 -0000
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>
B  B  ...
B  B  <Row>
B  B  B  B  <Cell>
B  B  B  B  B  B  <Data>navaid</Data>
B  B  B  B  </Cell>
B  B  B  B  <Cell>
B  B  B  B  B  B  <Data>airport</Data>
B  B  B  B  </Cell>
B  B  </Row>
B  B  ...
B  B  <Row>
B  B  B  B  <Cell>
B  B  B  B  B  B  <Data>navaid</Data>
B  B  B  B  </Cell>
B  B  B  B  <Cell>
B  B  B  B  B  B  <Data>enrouteAirway</Data>
B  B  B  B  </Cell>
B  B  </Row>
B  B  ...
</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">
B  B  <xsl:param name="element"/>
B  B  <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>
B  B  ...
B  B  <Row>
B  B  B  B  <Cell>
B  B  B  B  B  B  <Data>airport</Data>
B  B  B  B  </Cell>
B  B  B  B  <Cell>
B  B  B  B  B  B  <Data>airports</Data>
B  B  B  B  </Cell>
B  B  </Row>
B  B  ...
</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">
B  B  <xsl:param name="element"/>
B  B  <xsl:param name="parent"/>
B  B  <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:

B  B  <Row>
B  B  B  B  <Cell>
B  B  B  B  B  B  <Data>aviation</Data>
B  B  B  B  </Cell>
B  B  B  B  <Cell/>
B  B  </Row>

Then this call to f:getRow fails:

<xsl:sequence select="f:getRow('aviation', '')" />B  B  B  B  <!-- 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 ()

Current Thread