XML.orgXML.org
FOCUS AREAS |XML-DEV |XML.org DAILY NEWSLINK |REGISTRY |RESOURCES |ABOUT
OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index]
XSTL stylesheet workarounds for exceptions

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.

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index]


News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 1993-2007 XML.org. This site is hosted by OASIS