Include some records and exclude others

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • ITSimTech
    New Member
    • Feb 2008
    • 2

    Include some records and exclude others

    I'm trying to learn how/do two things here:
    1) If the user searches for "Data" ($searchtext = "Data") the output should also include the fourth record because Field1 contains "all".
    2) But the output of this same search should also exclude any records where Field1 contains "info" ($searchtext = "info"). You can see by the textsearch template that I have 3 case conversion variables that can be used to to include/exclude "All", "all", "ALL", "Info", "info", or "INFO"

    A statement like this includes "all" but I can't figure out how to get it to also exclude "info"
    <xsl:for-each select="record[*[name() = $searchfield][contains(., $ProperText) or contains(., $UCASETEXT) or contains(., $lcasetext) or ../Field1[contains(., 'ALL') or contains(., 'all') or contains(., 'All')]]]">

    XML Data
    [code=xml]
    <?xml version="1.0"?>
    <data>
    <record>
    <Field1>Data1-1</Field1>
    <Field2>Data1-2</Field2>
    <dtmField>200 8-01-28T01:01:00Z</dtmField>
    </record>
    <record>
    <Field1>Info</Field1>
    <Field2>Data2-2</Field2>
    <dtmField>200 8-01-28T02:02:00Z</dtmField>
    </record>
    <record>
    <Field1>Data3-1</Field1>
    <Field2>Data3-2</Field2>
    <dtmField>200 8-01-28T03:03:00Z</dtmField>
    </record>
    <record>
    <Field1>all</Field1>
    <Field2>Data4-2</Field2>
    <dtmField>200 8-01-28T04:04:00Z</dtmField>
    </record>
    <record>
    <Field1>All</Field1>
    <Field2>Data5-2</Field2>
    <dtmField>200 8-01-28T05:05:00Z</dtmField>
    </record>
    <record>
    <Field1>info</Field1>
    <Field2>Data6-2</Field2>
    <dtmField>200 8-01-28T06:06:00Z</dtmField>
    </record>
    </data>
    [/code]
    <!-- Desired output -->
    [code=xml]
    <?xml version="1.0"?>
    <data>
    <record>
    <Field1>Data1-1</Field1>
    <Field2>Data1-2</Field2>
    <dtmField>200 8-01-28T01:01:00Z</dtmField>
    </record>
    Record 2 is excluded because "Field1" = Info
    <record>
    <Field1>Data3-1</Field1>
    <Field2>Data3-2</Field2>
    <dtmField>200 8-01-28T03:03:00Z</dtmField>
    </record>
    <record>
    <Field1>all</Field1>
    <Field2>Data4-2</Field2>
    <dtmField>200 8-01-28T04:04:00Z</dtmField>
    </record>
    <record>
    <Field1>All</Field1>
    <Field2>Data5-2</Field2>
    <dtmField>200 8-01-28T05:05:00Z</dtmField>
    </record>
    Record 6 is excluded because "Field1" = info (notice the case is different)
    </data>
    [/code]

    XSL Stylesheet
    <!-- Include this just to show version and output method -->
    [code=xml]
    <?xml version="1.0"?>
    <xsl:styleshe et xmlns:xsl="http ://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>

    <!--
    The "selected" value of thes parameters are filled in for this example. Normally
    they are passed from an external ASP VBScript that processes inputs from another form where the values are input by the user.
    -->
    <xsl:param name="searchfie ld" select="Field1"/> <!-- Field to search -->
    <xsl:param name="searchtex t" select="Data"/> <!-- Text to search for -->
    <xsl:param name="sortbyfie ld" select="Field2"/> <!-- Field to sort output by -->
    <xsl:param name="sortorder " select="Descend ing"/> <!-- Sort order ascending or descending -->

    <xsl:template name="textsearc h">
    <xsl:for-each select="record[*[name() = $searchfield][contains(., $ProperText) or contains(., $UCASETEXT) or contains(., $lcasetext)]]">
    <xsl:sort select="*[name()=$sortbyf ield]" order="{$sortor der}"/>
    <xsl:call-template name="resulttab le"/>
    </xsl:for-each>
    </xsl:template>
    [/code]
    Last edited by jkmyoung; Feb 29 '08, 04:04 PM. Reason: code tags
  • jkmyoung
    Recognized Expert Top Contributor
    • Mar 2006
    • 2057

    #2
    perhaps add the following:
    [not (contains(.,'IN FO'))][not (contains(.,'In fo'))][not (contains(.,'in fo'))]

    Comment

    • ITSimTech
      New Member
      • Feb 2008
      • 2

      #3
      It seems you understand what I'm trying to do but when I typed my initial posting I should have written it differently. I rewrote it so maybe it makes more sense:
      This works:
      1) If the user searches for "entry" ($searchtext = "entry") the output should also include the fourth and fifth record because Field1 contains "all", "All", or "ALL" even though the fourth record doesn't contain any case of "entry". Also the fifth record should only be output once even though it contains any case of "all" in Field1 and also any case of "entry" in Field2. I've managed to accomplish this using this statement:
      <xsl:for-each select="record[*[name() = $searchfield][contains(., $ProperText) or contains(., $UCASETEXT) or contains(., $lcasetext) or ../Field1[contains(., 'ALL') or contains(., 'all') or contains(., 'All')]]]">

      I can't make this work though:
      2) But I want the output of this same search to ALSO exclude the second and sixth record because Field1 contains "info", "Info" or "INFO" even though Field2 contains "Entry", "entry", or "ENTRY". The info records won't be viewed using this stylesheet. The records where Field1 contains any case of "info" will only show up when you use a different stylesheet much like this one in which case it will be treated just like this stylesheet treats records where Field1 is "all".
      XML Data
      <?xml version="1.0"?>
      <data>
      <record>
      <Field1>Data1-1</Field1>
      <Field2>Entry 1-2</Field2>
      <dtmField>200 8-01-28T01:01:00Z</dtmField>
      </record>
      <record>
      <Field1>Info</Field1>
      <Field2>This entry is not readable</Field2>
      <dtmField>200 8-01-28T02:02:00Z</dtmField>
      </record>
      <record>
      <Field1>Data3-1</Field1>
      <Field2>Entry 3-2</Field2>
      <dtmField>200 8-01-28T03:03:00Z</dtmField>
      </record>
      <record>
      <Field1>all</Field1>
      <Field2>This record is readable by everyone</Field2>
      <dtmField>200 8-01-28T04:04:00Z</dtmField>
      </record>
      <record>
      <Field1>All</Field1>
      <Field2>This entry is also readable by everyone</Field2>
      <dtmField>200 8-01-28T05:05:00Z</dtmField>
      </record>
      <record>
      <Field1>info</Field1>
      <Field2>This entry is also not readable</Field2>
      <dtmField>200 8-01-28T06:06:00Z</dtmField>
      </record>
      </data>
      <!-- Desired output -->
      <record>
      <Field1>Data1-1</Field1>
      <Field2>Entry 1-2</Field2>
      <dtmField>200 8-01-28T01:01:00Z</dtmField>
      </record>
      Record 2 is excluded because Field1 = "Info"
      <record>
      <Field1>Data3-1</Field1>
      <Field2>Entry 3-2</Field2>
      <dtmField>200 8-01-28T03:03:00Z</dtmField>
      </record>
      <record>
      <Field1>all</Field1>
      <Field2>This entry is readable by everyone</Field2>
      <dtmField>200 8-01-28T04:04:00Z</dtmField>
      </record>
      Record 5 below is included only once even though Field2 contains "entry" AND Field1 contains "all"
      <record>
      <Field1>All</Field1>
      <Field2>This entry is also readable by everyone</Field2>
      <dtmField>200 8-01-28T05:05:00Z</dtmField>
      </record>
      Record 6 is excluded because "Field1" = info even though Field2 contains "entry"
      XSL Stylesheet
      <?xml version="1.0"?>
      <xsl:styleshe et xmlns:xsl="http ://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="html"/>
      <xsl:param name="searchfie ld" select="Field2"/>
      <xsl:param name="searchtex t" select="entry"/>
      <xsl:param name="sortbyfie ld" select="Field1"/>
      <xsl:param name="sortorder " select="Descend ing"/>
      <xsl:variable name="lowercase " select="'abcdef ghijklmnopqrstu vwxyz'"/>
      <xsl:variable name="uppercase " select="'ABCDEF GHIJKLMNOPQRSTU VWXYZ'"/>
      <xsl:variable name="lcasetext " select="transla te($searchtext, $uppercase, $lowercase)"/>
      <xsl:variable name="UCASETEXT " select="transla te($searchtext, $lowercase, $uppercase)"/>
      <xsl:variable name="ProperTex t" select="concat( translate(subst ring($searchtex t,1,1), $lowercase, $uppercase),tra nslate(substrin g($searchtext,2 ), $uppercase, $lowercase))"/>
      <xsl:template match="data">
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
      <title> Search Results </title>
      </head>
      <body>
      <p class="title"> Search Results </p>
      <table>
      <tr>
      <th> Field1 </th>
      <th> Field2 </th>
      <th> Date &amp; Time</th>
      </tr>
      <xsl:for-each select="record[*[name() = $searchfield][contains(., $ProperText) or contains(., $UCASETEXT) or contains(., $lcasetext) or ../Field1[contains(., 'ALL') or contains(., 'all') or contains(., 'All')]]]">
      <xsl:sort select="*[name()=$sortbyf ield]" order="{$sortor der}"/>
      <tr>
      <td>
      <xsl:value-of select="Field1"/>
      </td>
      <td>
      <xsl:value-of select="Field2"/>
      </td>
      <td>
      <xsl:value-of select="dtmFiel d"/>
      </td>
      </tr>
      </xsl:for-each>
      </table>
      </body>
      </html>
      </xsl:template>
      </xsl:stylesheet>

      Comment

      • jkmyoung
        Recognized Expert Top Contributor
        • Mar 2006
        • 2057

        #4
        Does tacking it on to the end not work?

        <xsl:for-each select="record[*[name() = $searchfield][contains(., $ProperText) or contains(., $UCASETEXT) or contains(., $lcasetext) or ../Field1[contains(., 'ALL') or contains(., 'all') or contains(., 'All')]]][not (contains(.,'IN FO'))][not (contains(.,'In fo'))][not (contains(.,'in fo'))]">

        Comment

        Working...