xsl-list
[Top] [All Lists]

RE: [xsl] Implementing a (fairly) complex business rule

2008-09-30 09:57:48
XSLT 2.0 is your friend. If you ran this in 2.0

string-length(s0:POSTCODE/text() = 0)

you would get an error message: the argument to string-length() must be a
string, not a boolean. As it is, string-length("true") is 4,
string-length("false") is 5, and both 4 and 5 convert to the boolean true
when treated as a boolean value.

Your closing paren is in the wrong place. 

Incidentally, the "/text()" scattered throughout your code is unnecessary
and in my view, bad practice. It means your code will fail if there are
comments in unexpected places in the source tree.

Michael Kay
http://www.saxonica.com/ 

-----Original Message-----
From: Bradley, Peter [mailto:pbradley(_at_)uwic(_dot_)ac(_dot_)uk] 
Sent: 30 September 2008 14:07
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Implementing a (fairly) complex business rule

I have a business rule that says that if the value of the 
REDUCEDI element is "00" and if the value of the DOMICILE 
element is in a list of values comprising XG, XH, XI, XK, XL, 
GG, JE and IM then a POSTCODE element must be present.  It 
should not be present otherwise.

If the POSTCODE element is present and has a NULL value, then 
a ReasonForNull attribute should be included, with a value of "1".

If the POSTCODE element is present and has a value, that 
value should be output and the ReasonForNull attribute should 
not be present.

I have expressed this as follows:

<!-- NULL is valid for a postcode -->
<xsl:if
test="/s0:HesaSqlExplicit_Response/s0:Institution/s0:Student/s
0:Instance
/s0:REDUCEDI = '00'">
  <xsl:if
  test="s0:DOMICILE='XF' or s0:DOMICILE='XG' or s0:DOMICILE='XH' or
  s0:DOMICILE='XI' or s0:DOMICILE='XK' or s0:DOMICILE='XL' or
  s0:DOMICILE='GG' or s0:DOMICILE='JE' or s0:DOMICILE='IM'">
    <POSTCODE>
      <xsl:if test="string-length(s0:POSTCODE/text() = 0)">
        <xsl:attribute name="ReasonForNull">
          <xsl:text>1</xsl:text>
        </xsl:attribute>
      </xsl:if>
      <xsl:if test="string-length(s0:POSTCODE/text()) > 0">
        <xsl:value-of select="s0:POSTCODE/text()"/>
      </xsl:if>
    </POSTCODE>
  </xsl:if>
</xsl:if>

However, in my output I am getting POSTCODE elements that 
both have a value and also have a ReasonForNull attribute 
with a value of "1".

Can anyone put me out of my misery?  I just cannot see how 
this can happen.

Thanks


Peter


--~------------------------------------------------------------------
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>
--~--