This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: efficient if/else
- From: "Michael Kay" <michael dot h dot kay at ntlworld dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Mon, 6 May 2002 21:29:03 +0100
- Subject: RE: [xsl] efficient if/else
- Reply-to: xsl-list at lists dot mulberrytech dot com
> I have something like the following:
>
> <Product>
> <e1 Action = "A"/>
> <e2 Action = "A"/>
> <e3 Action = "A"/>
> <e4 Action = "A"/>
> <e5 Action = "A"/>
> <more1>
> <stuff Action = "(Could be anything)"/>
> </more1>
> <more2>...</more2>
> ...
> </Product>
>
> I am interested in the most efficient way of going through the first 5
> elements and looking at the Action attribute.
>
<xsl:variable name="E" select="*[starst-with(name(), 'e')]"/>
<xsl:choose>
> If any is an "M", I will output an "M".
<xsl:when test="$E='M'">M</xsl:when>
> If they are all "A", I will output "A".
<xsl:when test="not($E != 'A')">A</xsl:when>
> If they are all "D", I will output "D".
<xsl:when test="not($E != 'D')">D</xsl:when>
> Any mixture of "A" and "D" should output an "M".
<xsl:when test="$E='A' and $E='D'">M</xsl:when>
>
> Another twist is that any of the "e elements" (e1, e2,
> e3,...) may or may
> not be present. If present, the Action attribute will always
> be present.
>
> I obviously don't want to have an n! search.
>
It's likely that each of these tests will involve a linear search of the e*
elements. If you want something faster than that, you could use keys.
Note that the condition all exploit the "existential equals": $E = 'X' is
true if any node in E equals 'X'. The inversion of this, not($E != 'X') is
true if there is not a $E that is not equal to 'X', i.e. if every E equals
'X'.
Michael Kay
Software AG
home: Michael.H.Kay@ntlworld.com
work: Michael.Kay@softwareag.com
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list