xsl-list
[Top] [All Lists]

Re: [xsl] Can a single XPath statement duplicate the functionality of this verbose <xsl:choose> statement?

2011-10-23 20:06:43
Hi Dimitre,
Yours has just the opposite behavior of Ken's: his failed on the second example, yours on the first; his succeeded on the first, yours on the second .

Thanks,
Mark

returns nothing:
<Stamp>
       <Formats souvenir-sheet="2895"/>
     <Location denomination="1"/>
</Stamp>

Returns '1', correct
<Stamp>
      <Formats souvenir-sheet="2896"/>
     <Location denomination="5"/>
     <Location souvenir-sheet="1"/>
   </Stamp>

Thanks,
Mark

-----Original Message----- From: Dimitre Novatchev
Sent: Sunday, October 23, 2011 5:51 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Can a single XPath statement duplicate the functionality of this verbose statement?

Use:

for $n in @souvenir-sheet | @minisheet | @booklet | @se-tenant | @coupon,
   $loc-n in ../Location/@*[name() = name($n)]

 return
   ($loc-n, ../Location/@denomination, 0)[1]

This relies on the fact mentioned in the definition of the problem,
that the attributes are mutually exclusive (only one of them can be
present).



--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.

On Sun, Oct 23, 2011 at 5:18 PM, G. Ken Holman
<gkholman(_at_)cranesoftwrights(_dot_)com> wrote:
At 2011-10-23 17:10 -0700, Mark wrote:

Although they do have the virtue of giving me my desired output, can the
following sequence of statements be replaced by a more generalized (shorter
and simpler) XPath statement without the repetitive "when" tests shown
below?

<xsl:choose>
        <xsl:when test="@souvenir-sheet">
          <xsl:copy-of select="if (../Location/@souvenir-sheet) then
../Location/@souvenir-sheet else if (../Location/@denomination) then
../Location/@denomination else '0' "/>
        </xsl:when>
        <xsl:when test="@minisheet">
          <xsl:copy-of select="if(../Location/@minisheet) then
../Location/@minisheet else if(../Location/@denomination) then
../Location/@denomination else '0'"/>
        </xsl:when>
        <xsl:when test="@booklet">
          <xsl:copy-of select="if(../Location/@booklet) then
../Location/@booklet else if(../Location/@denomination) then
../Location/@denomination else '0'"/>
        </xsl:when>
        <xsl:when test="@se-tenant">
          <xsl:copy-of select="if (../Location/@se-tenant) then
../Location/@se-tenant else if(../Location/@denomination) then
../Location/@denomination else '0'"/>
        </xsl:when>
        <xsl:when test="@coupon">
          <xsl:copy-of select=" if (../Location/@coupon) then
../Location/@coupon else if(../Location/@denomination) then
../Location/@denomination else '0'"/>
        </xsl:when>
</xsl:choose>

My XPath is very weak.

I tried:
<xsl:copy-of select="if (../Location[name(@*)=name(@*)]) then
../Location/@*  else if(../Location/@denomination) then
../Location/@denomination else '0'"></xsl:copy-of>

Presuming you have only a single attribute (the name() function will abend
if you have more than one), this may work for you ... it expresses a
sequence and selects the first member of that sequence:

<xsl:copy select="( ../Location[name(@*)=name(current()/@*)] ,
                   ../Location/@denomination ,
                   '0' )[1]"/>

This relies on the XPath 2 behaviour of sequence ( (), x ) collapsing to ( x
).

Note the use of current() to return the node that was current at the start
of evaluating the XPath expression (also available in XPath 1).

I hope this helps.

. . . . . . . . . Ken


--
Contact us for world-wide XML consulting and instructor-led training
Crane Softwrights Ltd.            http://www.CraneSoftwrights.com/s/
G. Ken Holman                   mailto:gkholman(_at_)CraneSoftwrights(_dot_)com
Google+ profile: https://plus.google.com/116832879756988317389/about
Legal business disclaimers:    http://www.CraneSoftwrights.com/legal


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>