Can not combine "if match=" and "when test"

Discussion in 'XML' started by kmunderwood@charter.net, Mar 15, 2005.

  1. Guest

    I am trying to combine "if match=" and "when test"
    I am a newbie, and have made both work separately, but I can not seem
    to combine them.


    This is my xml("index.xml")page(I can not change this, it comes to me
    this way.


    <?xml version="1.0" encoding="iso-8859-1" ?>
    - <fieldgate ser="6C000D010A0" tag="TTL Bulk Storage Farm" type="full"
    devices="all">
    <time>19700101-000000</time>
    <timezone>0</timezone>
    <ff_version>01.02.02-071 20050118</ff_version>
    <os_version>3.18</os_version>
    <conf>FXA520-AA1A</conf>
    - <device id="11183312ee" tag="B05" type="HART">
    <u4>°C</u4>
    <v4>22.22</v4>
    <u2>In H2O</u2>
    <dev>Cerabar S</dev>
    <man>Endress+Hauser</man>
    <u1>lb</u1>
    <v1>535.91</v1>
    <type>HART</type>
    - <param>
    <t1ch>Bulk Tank B5</t1ch>
    <t2ch>Weight in Pounds</t2ch>
    <max>43928.00</max>
    <min>0.00</min>
    </param>
    </device>
    </fieldgate>


    The "device" element repeats 11 more times,(tag number changes) and I
    want to ignore some,
    so I am using an "if match".
    I just repeat the table for each bulk tank that I want to display.


    This is my "if match" xsl("index.xsl"):
    It works, but I can not make a v1 under 2000, have the background
    change color


    <?xml version='1.0'?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
    <xsl:template match="/">
    <html>
    <body>
    <table width="800" border="2" bordercolor="#3300CC"
    bgcolor="#0099CC">
    <tr>
    <th>Tank #</th>
    <th>Current Level</th>
    <th>Temp.</th>
    </tr>
    <xsl:for-each select="fieldgate/device">
    <xsl:if match=".[tag='B01']">
    <tr>
    <td width="200"><xsl:value-of select="tag"/></td>
    <td width="200"><xsl:value-of select="v1"/></td>
    <td width="200"><xsl:value-of select="v4"/></td>
    </tr>
    </xsl:if>
    </xsl:for-each>
    </table>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>


    This shows an html page like this:
    Tank # CurrentLevel Temp.
    B01 395.47 69.65

    I want the cell background to change to red when the level is below
    2000


    This is my "when test" xsl("index2.xsl"):
    It works, but shows all tags, and I want to ignore some.


    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template
    match="/">
    <html>
    <body>
    <h2>My CD Collection</h2>
    <table border="1">
    <tr bgcolor="#9acd32">
    <th>Tank</th>
    <th>Level</th>
    </tr>
    <xsl:for-each select="fieldgate/device">
    <tr>
    <td><xsl:value-of select="tag"/></td>
    <xsl:choose>
    <xsl:when test="v1 &lt; 100">
    <td bgcolor="#ff00ff">
    <xsl:value-of select="v1"/></td>
    </xsl:when>
    <xsl:eek:therwise>
    <td><xsl:value-of select="v1"/></td>
    </xsl:eek:therwise>
    </xsl:choose>
    </tr>
    </xsl:for-each>
    </table>
    </body>
    </html>
    </xsl:template></xsl:stylesheet>



    This is my html:

    <html>

    <head>
    <style type="text/css">
    th, td { font-size: 200%; }
    </style>

    </head>
    <body>


    <script language="javascript">
    // Load XML
    var xml = new ActiveXObject("Microsoft.XMLDOM")
    xml.async = false
    xml.load("index.xml")

    // Load the XSL
    var xsl = new ActiveXObject("Microsoft.XMLDOM")
    xsl.async = false
    xsl.load("index.xsl")

    // Transform
    document.write(xml.transformNode(xsl))
    </script>

    </body>
    </html>


    I have tried various combinations, to no avail.
    If you can not help, can you suggest an article or suggestions on which
    way to go?
    , Mar 15, 2005
    #1
    1. Advertising

  2. <xsl:if match

    xsl:if does not have a match attribute it has a test attribute.


    =".[tag='B01']">

    You can't use [] predicates after .
    just use
    ="tag='B01'"

    David
    David Carlisle, Mar 15, 2005
    #2
    1. Advertising

  3. Guest

    OK, What can I use to get the controlled results that I am looking for?
    Out of all of the ways to extract xml data and put it into a web page,
    which should I learn to do?

    Can I change the following xsl, and apply a "choose", and "when test"
    to get only the tag='B01' to show up?
    When I try to do this, the result is a "true" display in the column for
    tag='B01', and a "false" for the other tags.
    Can I trick it somehow?
    I will learn whatever method will give me the controls I need.

    Thanks, Ken

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template
    match="/">
    <html>
    <body>
    <h2>Bulk Storage Tanks</h2>
    <table border="1">
    <tr bgcolor="#9acd32">
    <th>Tank</th>
    <th>Level</th>
    <th>Temperature</th>
    </tr>
    <xsl:for-each select="fieldgate/device">
    <tr>
    <td><xsl:value-of select="tag"/></td>
    <xsl:choose>
    <xsl:when test="v1 &lt; 600">
    <td bgcolor="#ff00ff">
    <xsl:value-of select="v1"/></td>
    </xsl:when>
    <xsl:eek:therwise>
    <td><xsl:value-of select="v1"/></td>
    </xsl:eek:therwise>
    </xsl:choose>
    <td><xsl:value-of select="v4"/></td>
    </tr>
    </xsl:for-each>
    </table>
    </body>
    </html>
    </xsl:template></xsl:stylesheet>

    David Carlisle wrote:
    > <xsl:if match
    >
    > xsl:if does not have a match attribute it has a test attribute.
    >
    >
    > =".[tag='B01']">
    >
    > You can't use [] predicates after .
    > just use
    > ="tag='B01'"
    >
    > David
    , Mar 21, 2005
    #3
  4. > Can I change the following xsl, and apply a "choose", and "when test"
    > to get only the tag='B01' to show up?


    most likely but you'd have to give some hint about the criterion that
    you want to use.

    I also note that in your sample posted earlier tag was an attribute of
    device

    but you have

    <td><xsl:value-of select="tag"/></td>

    which would select an element, so selects nothing in this case you need
    @tag to select an attribute node.

    David
    David Carlisle, Mar 22, 2005
    #4
  5. Guest

    OK, I want to
    1. Only show the <tag> that want to, and
    2. Turn an attribute a color when it falls below a certain level.


    This is the way I want the html to display:


    Tank Level Temperature
    B05 535.91 22.22

    535.91 background turns red, the way I need it to.
    But, the way it pulls in all "Tag"
    It looks like:


    Tank Level Temperature
    B05 535.91 22.22
    B04 42567.36 22.81
    _4..20mA-2 -0.01 <no data>


    I want to ignore the _4..20mA-2, among others.
    When the tank level falls below 600, I want the background or text to
    turn red.


    This is the way I get the xml.
    (its abreviated. It is very long and shows 17 "Tag", or devices, but I
    only want to show 12 of them)

    The full xml file can be viewed here:
    http://home.earthlink.net/~kmunderwood/index.xml



    <?xml version="1.0" encoding="iso-8859-1" ?>
    <fieldgate ser="6C000D010A0" tag="TTL Bulk Storage Farm" type="full"
    devices="all">
    <timezone>0</timezone>
    <os_version>3.18</os_version>
    <conf>FXA520-AA1A</conf>
    <device id="11183312ee" tag="B05" type="HART">
    <u4>°C</u4>
    <v4>22.22</v4>
    <dev>Cerabar S</dev>
    <man>Endress+Hauser</man>
    <u1>lb</u1>
    <v1>535.91</v1>
    <type>HART</type>
    <unid>11183312ee</unid>
    </device>
    <device id="_4..20mA-2" tag="_4..20mA-2" type="INTRN">
    <u>mA</u>
    <tag>_4..20mA-2</tag>
    <hlsts1>OK</hlsts1>
    <v1>-0.01</v1>
    <man>Endress+Hauser</man>
    <unid>_4..20mA-2</unid>
    </device>
    </fieldgate>


    This is the xsl:


    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Tra­nsform"><xsl:templatematch="/">

    <html>
    <body>
    <h2>Bulk Storage Tanks</h2>
    <table border="1">
    <tr bgcolor="#9acd32">
    <th>Tank</th>
    <th>Level</th>
    <th>Temperature</th>
    </tr>
    <xsl:for-each select="fieldgate/device">
    <tr>
    <td><xsl:value-of select="@tag"/></td>
    <xsl:choose>
    <xsl:when test="v1 &lt; 600">
    <td bgcolor="#ff00ff">
    <xsl:value-of select="v1"/></td>
    </xsl:when>
    <xsl:eek:therwise>
    <td><xsl:value-of select="v1"/></td>
    </xsl:eek:therwise>
    </xsl:choose>
    <td><xsl:value-of select="v4"/></td>
    </tr>
    </xsl:for-each>
    </table>
    </body>
    </html>
    </xsl:template></xsl:styleshee­t>


    This works fine, but includes all "tag", and I want to ignore some.


    Tank Level Temperature
    B05 535.91 22.22
    B04 42567.36 22.81
    _4..20mA-2 -0.01 Blank


    The 535.91 background turns red, which is what I am looking for, but I
    want to ignore <tag> _4..20mA-2
    Plus, this way, it sorts all wrong.
    I would like to show only 1 tank in the code, then I can repeat it in
    separate tables and do whatever I want.

    I had success displaying only the ones I wanted, using an "if match".
    <xsl:if match=".[tag='B05']">, but I cant "test" on it.


    This is the HTML:


    <html>


    <head>
    <style type="text/css">
    th, td { font-size: 200%; }
    </style>
    </head>


    <body>


    <script language="javascript">
    // Load XML
    var xml = new ActiveXObject("Microsoft.XMLDO­M")
    xml.async = false
    xml.load("index.xml")


    // Load the XSL
    var xsl = new ActiveXObject("Microsoft.XMLDO­M")
    xsl.async = false
    xsl.load("index.xsl")


    // Transform
    document.write(xml.transformNo­de(xsl))
    </script>


    </body>
    </html>



    If can can give me a few a clues to work on,
    I Thank You, Ken



    David Carlisle wrote:
    > > Can I change the following xsl, and apply a "choose", and "when

    test"
    > > to get only the tag='B01' to show up?

    >
    > most likely but you'd have to give some hint about the criterion that
    > you want to use.
    >
    > I also note that in your sample posted earlier tag was an attribute

    of
    > device
    >
    > but you have
    >
    > <td><xsl:value-of select="tag"/></td>
    >
    > which would select an element, so selects nothing in this case you

    need
    > @tag to select an attribute node.
    >
    > David
    , Mar 23, 2005
    #5

  6. > This works fine, but includes all "tag", and I want to ignore some.

    That's because you select them all

    <xsl:for-each select="fieldgate/device">
    If you only want some of them, just select the ones you want, I can't
    work out what that is but

    <xsl:for-each select="fieldgate/device[not(starts_with(@tag,'_'))]">

    wouldn't select those with a tag attribute starting with _ so

    > I want to ignore <tag> _4..20mA-2


    for example.



    > I had success displaying only the ones I wanted, using an "if match".
    > <xsl:if match=".[tag='B05']">, but I cant "test" on it.


    Not of you were using XSLT, a match attribute on xsl:if and a [
    following a . are both fatal syntax errors and you would get no output.
    You must have been using the Microsoft-specific transformation language
    built in to IE5 (and supported in msxml3/IE6 for backwards
    compatibility) The code you show however is in the XSLT namespace not
    the namespace for that now deprecated language.

    David
    David Carlisle, Mar 23, 2005
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. pjbates
    Replies:
    1
    Views:
    4,514
    Dan Vogt
    May 2, 2006
  2. hiwa
    Replies:
    0
    Views:
    630
  3. Robert Allan Schwartz
    Replies:
    7
    Views:
    364
    Marco Manfredini
    Aug 13, 2004
  4. Skybuck Flying

    Call oddities: &Test() vs &Test vs Test

    Skybuck Flying, Oct 4, 2009, in forum: C Programming
    Replies:
    1
    Views:
    683
    Skybuck Flying
    Oct 4, 2009
  5. Chris Simeone
    Replies:
    0
    Views:
    214
    Chris Simeone
    Aug 30, 2004
Loading...

Share This Page