Loading ...
Sorry, an error occurred while loading the content.

how to use substing and conditional selection in xsl

Expand Messages
  • PANDUR_K_PRASANNA@usa.net
    how to use substing and conditional selection in xsl as described in following code. CASE I i found that conditional selection work fine when i put namespace
    Message 1 of 2 , Jun 25, 2001
    • 0 Attachment
      how to use substing and conditional selection in xsl as described in
      following code.

      CASE I

      i found that conditional selection work fine when i put namespace as
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
      with following conditional statement.
      <xsl:for-each select="NAME/ADDRESS[@StartTime > '04/26/2001' and
      @EndTime <= '05/27/2001'] />

      CASE II
      I also found that the substring function works fine with this
      NameSpace,
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      and substing code as,

      <xsl:for-each select="NAME/ADDRESS/>
      <td>
      <xsl:value-of select="substring(@StartTime,1,10)"/>
      </td>
      </xsl:for-each>

      I want both substing selection and conditional selection to
      be done in same style sheet.How can I achieve this?

      I did try out including both namespaces in a single xsl and
      implenting the substring and conditional statements, but it does not
      work!!!!

      A working example would be appreciated.

      Thanks to all in Advance
    • John E. Simpson
      [As an aside, I think it s best to post questions like this one -- regarding the transformation of XML to (X)HTML, rather than to XSL-FO -- to the XSL-L,
      Message 2 of 2 , Jun 25, 2001
      • 0 Attachment
        [As an aside, I think it's best to post questions like this one --
        regarding the transformation of XML to (X)HTML, rather than to XSL-FO -- to
        the XSL-L, XHTML-L, or XML-L mailing lists. You'd probably get more replies
        that way. :)]

        At 06:34 PM 06/25/2001 +0000, PANDUR_K_PRASANNA@... wrote:
        >i found that conditional selection work fine when i put namespace as
        ><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
        >...
        >I also found that the substring function works fine with this
        >NameSpace,
        ><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

        As a starting point, you should stop using the first namespace declaration
        above (the one which ends "WD-xsl"). It was useful as an interim,
        Microsoft-supported namespace, but not even Microsoft recommends its
        continued use. Also, your xsl:stylesheet element needs a version="1.0"
        attribute.

        >I want both substring selection and conditional selection to
        >be done in same style sheet.How can I achieve this?

        If I understand correctly, you want to do *something* like the following:

        <!-- Get all ADDRESS children of the NAME child(ren) of the
        current node, as long as the ADDRESS elements' StartTime attributes
        indicate a date later than 04/26/2001 and their EndTime attributes
        indicate a date earlier than or equal to 05/27/2001. -->
        <xsl:for-each
        select="NAME/ADDRESS[@StartTime > '04/26/2001' and
        @EndTime <= '05/27/2001']">
        <td>
        <!-- Transfer to the result tree the value of the StartTime
        attribute's first 10 characters (i.e., just the date) -->
        <xsl:value-of select="substring(@StartTime,1,10)"/>
        </td>
        </xsl:for-each>

        Is that right?

        If so, first a couple of housekeeping things:

        (1) The code fragments included in your message lacked proper punctuation
        -- the double quotes around the full value of the select attributes. I'm
        assuming this was just a typo or copy-and-paste error; if not, it's easily
        fixed.

        (2) A much bigger problem, perhaps even insurmountable, is the apparent
        assumption in your code that XML/XSLT has an inherent awareness of date
        data types. That's not so. The only data types you can handle in an XSLT
        stylesheet are string, number, Boolean, and result-tree fragment (RTF).
        Testing for some value > '04/26/2001', for example, simply selects that
        value if AS A STRING (lexically) it exceeds that test string. So
        '05/31/1900' is a "greater" string value than '04/26/2001', even though as
        a date value it's "smaller." If you really need to test dates, your
        StartTime and EndTime attributes will need to use a date/time format which
        works AS A STRING, not just AS A DATE. For instance:
        <ADDRESS StartTime="2001/04/27 13:04:35">...</ADDRESS>
        or some such.

        Okay, now, suppose the source document looks like this:

        <root>
        <!-- Skipped - EndTime too late -->
        <NAME>
        <ADDRESS
        StartTime="2001/04/27 13:04:35"
        EndTime="2001/06/22 01:02:03"/>
        </NAME>
        <!-- Skipped - StartTime too soon -->
        <NAME>
        <ADDRESS
        StartTime="2001/02/27 13:04:35"
        EndTime="2001/06/22 01:02:03"/>
        </NAME>
        <!-- Skipped - StartTime too soon and EndTime too late -->
        <NAME>
        <ADDRESS
        StartTime="2001/01/27 13:04:35"
        EndTime="2001/07/22 01:02:03"/>
        </NAME>
        <!-- Just right :) -->
        <NAME>
        <ADDRESS
        StartTime="2001/04/27 13:04:35"
        EndTime="2001/05/01 01:02:03"/>
        </NAME>
        </root>

        Start out with a stylesheet that does no selection by predicate at all
        (xsl:stylesheet omitted):

        <xsl:template match="root">
        <html>
        <body>
        <table>
        <xsl:for-each
        select="NAME/ADDRESS">
        <tr><td>
        <xsl:value-of select="substring(@StartTime,1,10)"/>
        </td></tr>
        </xsl:for-each>
        </table>
        </body>
        </html>
        </xsl:template>

        This produces the expected output -- one row and td element for each
        ADDRESS element.

        This should put you a good way toward the solution.

        >I did try out including both namespaces in a single xsl and
        >implenting the substring and conditional statements, but it does not
        >work!!!!

        No, it doesn't. :)

        =====================================================================
        John E. Simpson | "I just got out of the hospital. I was in a
        http://www.flixml.org | speed reading accident. I hit a bookmark and
        XML Q&A: www.xml.com | flew across the room." (Steven Wright)
      Your message has been successfully submitted and would be delivered to recipients shortly.