This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: efficient if/else


> 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]