Altova Mailing List Archives>Archive Index >xml-dev Archive Home >Recent entries >Thread Prev - >Thread Next - RE: [xml-dev] XSTL stylesheet workarounds for exceptions [xml-dev] XSTL stylesheet workarounds for exceptionsTo: xml-dev@-----.---.--- Date: 2/9/2009 10:19:00 AM Hi All,
Â
I am unable to come up with a suitable workaround to kick in when an element is not available. Below are various approaches attempted without success:
Â
Scenario Â
A. <xsl:template match="/">
 <area>
   <xsl:apply-templates select="//ns:p"/>
     <xsl:variable name="hobbie" select="ns:p[ns:strong='Hobbie:']"/>
     <xsl:apply-templates select="$hobbie"/>
     <xsl:choose>
       <xsl:when test="empty($hobbie)">
         <xsl:variable name="no_hobbie" select="true"/>Â
       </xsl:when>
       <xsl:otherwise>
         <xsl:variable name="no_hobbie" select="false"/>
       </xsl:otherwise>
     </xsl:choose>
 </area>
</xsl:template>
Â
<xsl:if test="${no_hobbie} = 'false'">
 <xsl:template match="ns:p[ns:strong='Hobbie:']">
   <xsl:for-each select="text()[normalize-space() != '']">
     <hobbie><xsl:value-of select="normalize-space()"/></hobbie>
   </xsl:for-each>
 </xsl:template>
</xsl:if>
Â
Compilation error Error at xsl:if on line 35 column 41
 XPST0003: XPath syntax error at char 1 on line 35 in {${no_hobbies}:
   expected "<name>", found "{"
Error at xsl:if on line 35 column 41
 XTSE0010: Element xsl:if must not appear directly within xsl:stylesheet
Warning: at xsl:variable on line 13 column 59
 SXWN9001: A variable with no following sibling instructions has no effect
Warning: at xsl:variable on line 16 column 60
 SXWN9001: A variable with no following sibling instructions has no effect
Error at xsl:template on line 36 column 53
 XTSE0010: An xsl:if element must not contain an xsl:template element
Error at xsl:template on line 36 column 53
 XTSE0010: Element must be used only at top level of stylesheet
B. <xsl:template match="/">
 <area>
   <xsl:apply-templates select="//ns:p"/>
     <xsl:variable name="hobbie" select="ns:p[ns:strong='Hobbie:']"/>
     <xsl:apply-templates select="$hobbie"/>
     <xsl:choose>
       <xsl:when test="empty($hobbie)">
         <hobbie>Unknown</hobbie>Â
       </xsl:when>
       <xsl:otherwise>
         <xsl:template match="ns:p[ns:strong='Hobbie:']">
           <xsl:for-each select="text()[normalize-space() != '']">
             <hobbie><xsl:value-of select="normalize-space()"/></hobbie>
           </xsl:for-each>
         </xsl:template>
       </xsl:otherwise>
     </xsl:choose>
 </area>
</xsl:template>
Â
Compilation error Error at xsl:template on line 17 column 61
 XTSE0010: An xsl:otherwise element must not contain an xsl:template element
Error at xsl:template on line 17 column 61
 XTSE0010: Element must be used only at top level of stylesheet
C. <xsl:template match="/">
 <area>
   <xsl:apply-templates select="//ns:p"/>
     <xsl:variable name="hobbie" select="ns:p[ns:strong='Hobbie:']"/>
     <xsl:apply-templates select="$hobbie"/>
     <xsl:choose>
       <xsl:when test="empty($hobbie)">
         <hobbie>Unknown</hobbie>Â
       </xsl:when>
       <xsl:otherwise>
           <xsl:call-template name="hobbie"/>
       </xsl:otherwise>
     </xsl:choose>
 </area>
</xsl:template>
Â
<xsl:template name="hobbie" match="ns:p[ns:strong='Hobbie:']">
 <xsl:for-each select="text()[normalize-space() != '']">
   <hobbie><xsl:value-of select="normalize-space()"/></hobbie>
 </xsl:for-each>
</xsl:template>
Â
Output <hobbie>fishing</hobbie>Â Â Â Â Â // should pick up the valid element if there is one exist.
<hobbie>Unknown</hobbie>  // only create a default element value when no such element exist.Â
D. <xsl:template match="/">
 <area>
   <xsl:apply-templates select="//ns:p"/>
     <xsl:variable name="hobbie" select="ns:p[ns:strong='Hobbie:']"/>
     <xsl:apply-templates select="$hobbie"/>
     <xsl:if test="empty($hobbie)">
         <hobbie>Unknown</hobbie>Â
     </xsl:if>
 </area>
</xsl:template>
Â
<xsl:template match="ns:p[ns:strong='Hobbie:']">
 <xsl:for-each select="text()[normalize-space() != '']">
   <hobbie><xsl:value-of select="normalize-space()"/></hobbie>
 </xsl:for-each>
</xsl:template>
Â
Output <hobbie>fishing</hobbie>Â Â Â Â Â // should pick up the valid element if there is one exist.
<hobbie>Unknown</hobbie> // only create a default element value when no such element exist.
Â
I am very new XSLT and can do with some helpful suggestion.
Â
Many thanks,
Jack
Make Yahoo!7 your homepage and win a trip to the Quiksilver Pro. Find out more | ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
