Re: [xsl] Design question

Subject: Re: [xsl] Design question
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Wed, 10 Jul 2002 09:46:42 +0100
Hi Antonio,

> You could do what you say, but why not doing the following:
>
> <xsl:template match="test[@type='positive']">
> <da:Positive name="@name">
> <xsl:for-each select="param">
> <xsl:choose>
>     <xsl:when test="starts-with(@name,'p')">
>         <xsl:attribute name="{@name}"><xsl:value-of 
> select="."/></xsl:attribute>
>     </xsl:when>
>     <xsl:otherwise>
>         <xsl:element name="da:Date">
>             <xsl:attribute name="number"><xsl:value-of 
> select="substring(@name,4)"/></xsl:attribute>
>             <xsl:attribute name="value"><xsl:value-of 
> select="."/></xsl:attribute>
>         </xsl:element>
>     </xsl:otherwise>
> </xsl:choose>
> </xsl:for-each>
> </da:Positive>
> </xsl:template>

The reason Jay couldn't use that is that for some arrangements of
parameters this would lead to attributes being added after child
elements have already been added to the da:Positive element, which is
an error in XSLT. For example, with the input specified:

<test type="positive" name="Test 1">
  <param name="p1">123</param>
  <param name="date1">July 9</param>
  <param name="p2">false</param>
</test>

Your code is equivalent to:

<da:Positive name="@name"> <!-- [sic -- forgot {}s] -->
  <xsl:attribute name="p1">123</xsl:attribute>
  <xsl:element name="da:Date">
    <xsl:attribute name="number">1</xsl:attribute>
  </xsl:element>
  <xsl:attribute name="p2">false</xsl:attribute>
</da:Positive>

Processors that don't halt when they encounter an attribute being
added after element content ignore the attribute, so either you get an
error or erroneous output; either way it's not much good.

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread