Need to add the namespace in the input document:
<OSM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <EstablishmentDetail>
         <RatingValue>5</RatingValue>
         <RatingDate>2008-05-15</RatingDate>
    </EstablishmentDetail>
    <EstablishmentDetail>
         <RatingValue>AwaitingInspection</RatingValue>
         <RatingDate xsi:nil="true"/>
    </EstablishmentDetail>
</OSM>
I'm not getting the right value out of the standard fn:nilled() function hence substituted a user function:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet 
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:l="local:functions">
  
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="/">
    <RatingValues>
      <xsl:for-each select="//EstablishmentDetail">
        <EstablishmentDetail index="{position()}" >
          <RatingValue>
            <xsl:value-of select="('XX'[l:nilled(current()/RatingDate) ], 
                                    current()/RatingValue)[1]" />
          </RatingValue>
          <Nilled>
            <xsl:value-of select="nilled(RatingDate)" />
          </Nilled>          
        </EstablishmentDetail>
      </xsl:for-each>
    </RatingValues>
  </xsl:template>
  
  <xsl:function name="l:nilled" as="xs:boolean" >
    <xsl:param name="e" as="element()" />
    
    <xsl:sequence select="exists($e/@xsi:nil) and $e/@xsi:nil eq 'true'" />
  </xsl:function>
  
</xsl:stylesheet>
which produces:
<?xml version="1.0" encoding="UTF-8"?>
<RatingValues xmlns:l="local:functions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <EstablishmentDetail index="1">
      <RatingValue>5</RatingValue>
      <Nilled>false</Nilled>
   </EstablishmentDetail>
   <EstablishmentDetail index="2">
      <RatingValue>XX</RatingValue>
      <Nilled>false</Nilled>
   </EstablishmentDetail>
</RatingValues>
The Nilled elements in the output just to show that I'm getting false for both cases.