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]

Re: Default attribute value templates


Trevor Nash wrote:

> Is there a way of specifying via an attribute value template (or
> similar mechanism) that the attribute is absent?
> 
> Example:
> I have a template which matches a specific element, then does an
> apply-templates with a sort.  The application is supposed to be fairly
> generic, so it seems a nice idea to allow those attributes of sort
> which are attribute value templates to be parameterized thus:
> 
> <xsl:template match="x">
>      <xsl:apply-templates>
>            <xsl:sort order="{@order}" ... />
>      </xsl:apply-templates>
> </xsl:template>
> 
> The problem is, given <x>...</x> the transformation fails "order must
> be ascending or descending".
> 
> I can see how I could handle this by substituting appropriate values
> when the attribute is mising, but
>   a) it would involve hard wiring the default values, which would be
> bad news if they ever changed
>   b) it seems inordinately messy
>   c) I don't think it would always behave identically if for example
> the input is  <x order="">...</x> : becuase some processors might take
> this as 'use the default', others will reject it.
> 
> Have I missed anything?

Hi Trevor,

MSXML does not signal an error and interprets the lack of @order or an empty string
value of @order exactly as you wanted -- the whole AVT is discarded and no "order"
attribute is specified.

I wonder if this is not a bug in MSXML 4.

Otherwise, one solution to your problem is the following:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:template match="x">
  <xsl:choose>
    <xsl:when test="@order and (@order = 'ascending'
                                or @order = 'descending')">
       <xsl:apply-templates>
           <xsl:sort order="{@order}"/>
       </xsl:apply-templates>
    </xsl:when>
    <xsl:otherwise>
       <xsl:apply-templates>
           <xsl:sort/>
       </xsl:apply-templates>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>


Hope this helped.

Cheers,
Dimitre Novatchev.




__________________________________________________
Do You Yahoo!?
Get personalized email addresses from Yahoo! Mail
http://personal.mail.yahoo.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]