"greater than" works but "less than" doesn't?
Asked Answered
T

4

15

This works:

<xsl:when test="(price &gt;= 10)">

But this doesn't (the code inside the test doesn't execute and the following column is not rendered - for any row):

<xsl:when test="(price &lt;= 9)">

I'm testing this XML and XSL here: http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_choose

Why?

The full XSL is here:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<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>Title</th>
      <th>Artist</th>
      <th>Price</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <xsl:choose>
      <xsl:when test="(price &lt; 9)">
         <td bgcolor="#00aaff">
           <xsl:value-of select="artist"/>
         </td>
      </xsl:when>
      <xsl:otherwise>
         <td><xsl:value-of select="artist"/></td>
      </xsl:otherwise>
      </xsl:choose>
      <td><xsl:value-of select="price"/></td>
      </tr>

    </xsl:for-each>
  </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

And XML source is this:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
        <price>9.90</price>
        <year>1988</year>
    </cd>
    <cd>
        <title>Greatest Hits</title>
        <artist>Dolly Parton</artist>
        <country>USA</country>
        <company>RCA</company>
        <price>9.90</price>
        <year>1982</year>
    </cd>
    <cd>
        <title>Still got the blues</title>
        <artist>Gary Moore</artist>
        <country>UK</country>
        <company>Virgin records</company>
        <price>10.20</price>
        <year>1990</year>
    </cd>
    <cd>
        <title>Eros</title>
        <artist>Eros Ramazzotti</artist>
        <country>EU</country>
        <company>BMG</company>
        <price>9.90</price>
        <year>1997</year>
    </cd>
    <cd>
        <title>One night only</title>
        <artist>Bee Gees</artist>
        <country>UK</country>
        <company>Polydor</company>
        <price>10.90</price>
        <year>1998</year>
    </cd>
    <cd>
        <title>Sylvias Mother</title>
        <artist>Dr.Hook</artist>
        <country>UK</country>
        <company>CBS</company>
        <price>8.10</price>
        <year>1973</year>
    </cd>
    <cd>
        <title>Maggie May</title>
        <artist>Rod Stewart</artist>
        <country>UK</country>
        <company>Pickwick</company>
        <price>8.50</price>
        <year>1990</year>
    </cd>
    <cd>
        <title>Romanza</title>
        <artist>Andrea Bocelli</artist>
        <country>EU</country>
        <company>Polydor</company>
        <price>10.80</price>
        <year>1996</year>
    </cd>
    <cd>
        <title>When a man loves a woman</title>
        <artist>Percy Sledge</artist>
        <country>USA</country>
        <company>Atlantic</company>
        <price>8.70</price>
        <year>1987</year>
    </cd>
    <cd>
        <title>Black angel</title>
        <artist>Savage Rose</artist>
        <country>EU</country>
        <company>Mega</company>
        <price>10.90</price>
        <year>1995</year>
    </cd>
    <cd>
        <title>1999 Grammy Nominees</title>
        <artist>Many</artist>
        <country>USA</country>
        <company>Grammy</company>
        <price>10.20</price>
        <year>1999</year>
    </cd>
    <cd>
        <title>For the good times</title>
        <artist>Kenny Rogers</artist>
        <country>UK</country>
        <company>Mucik Master</company>
        <price>8.70</price>
        <year>1995</year>
    </cd>
    <cd>
        <title>Big Willie style</title>
        <artist>Will Smith</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>9.90</price>
        <year>1997</year>
    </cd>
    <cd>
        <title>Tupelo Honey</title>
        <artist>Van Morrison</artist>
        <country>UK</country>
        <company>Polydor</company>
        <price>8.20</price>
        <year>1971</year>
    </cd>
    <cd>
        <title>Soulsville</title>
        <artist>Jorn Hoel</artist>
        <country>Norway</country>
        <company>WEA</company>
        <price>7.90</price>
        <year>1996</year>
    </cd>
    <cd>
        <title>The very best of</title>
        <artist>Cat Stevens</artist>
        <country>UK</country>
        <company>Island</company>
        <price>8.90</price>
        <year>1990</year>
    </cd>
    <cd>
        <title>Stop</title>
        <artist>Sam Brown</artist>
        <country>UK</country>
        <company>A and M</company>
        <price>8.90</price>
        <year>1988</year>
    </cd>
    <cd>
        <title>Bridge of Spies</title>
        <artist>T`Pau</artist>
        <country>UK</country>
        <company>Siren</company>
        <price>7.90</price>
        <year>1987</year>
    </cd>
    <cd>
        <title>Private Dancer</title>
        <artist>Tina Turner</artist>
        <country>UK</country>
        <company>Capitol</company>
        <price>8.90</price>
        <year>1983</year>
    </cd>
    <cd>
        <title>Midt om natten</title>
        <artist>Kim Larsen</artist>
        <country>EU</country>
        <company>Medley</company>
        <price>7.80</price>
        <year>1983</year>
    </cd>
    <cd>
        <title>Pavarotti Gala Concert</title>
        <artist>Luciano Pavarotti</artist>
        <country>UK</country>
        <company>DECCA</company>
        <price>9.90</price>
        <year>1991</year>
    </cd>
    <cd>
        <title>The dock of the bay</title>
        <artist>Otis Redding</artist>
        <country>USA</country>
        <company>Atlantic</company>
        <price>7.90</price>
        <year>1987</year>
    </cd>
    <cd>
        <title>Picture book</title>
        <artist>Simply Red</artist>
        <country>EU</country>
        <company>Elektra</company>
        <price>7.20</price>
        <year>1985</year>
    </cd>
    <cd>
        <title>Red</title>
        <artist>The Communards</artist>
        <country>UK</country>
        <company>London</company>
        <price>7.80</price>
        <year>1987</year>
    </cd>
    <cd>
        <title>Unchain my heart</title>
        <artist>Joe Cocker</artist>
        <country>USA</country>
        <company>EMI</company>
        <price>8.20</price>
        <year>1987</year>
    </cd>
</catalog>
Tapster answered 2/10, 2012 at 10:36 Comment(10)
Define "works" and "doesn't work". Suspect though that you need to convert your values to numerics to do the conversion.Faraday
did you try: <xsl:when test="number(price) &lt;= 1)"> ?Escamilla
Also, the example at the top doesn't match your full XSL, which refers to > 10.Faraday
@JonEgerton, I now described the problem.Tapster
@Pierre, thanks for your suggestion, but the result is still the same. Besides, it is working with &gt; which is an operator that works with the same type of arguments. Any other suggestion?Tapster
@JonEgerton, not sure what you mean with "refers to > 10". You mean not encoded? It is now and the result is the same...Tapster
@FabioMilheiro: You're question was inconsistent with itself. You've since fixed it.Faraday
The example you have on line is completely different data, and different xsl.Faraday
Both "when"s were making confusion. The example attached now doens't work, but if I change &lt; to &gt; it starts to work. Any clues about where I should look?Tapster
Once again, define "doesn't work". This question is a mess because you have not been able to articulate your expected output. Please show your expected output from the sample input and take care not to make any editing mistakes.Topotype
V
14

There are lots of XSLT processors you can download and install, like Saxon 6.5.5 for XSLT 1.0 (http://saxon.sourceforge.net/#F6.5.5) or Saxon 9.4 (http://saxon.sourceforge.net/#F9.4HE) for XSLT 2.0 or like AltovaXML (http://www.altova.com/altovaxml.html) for XSLT 1.0 or 2.0. Additionally some OS come with an XSLT 1.0 processor (e.g. xsltproc on LINUX I think, Windows with MSXML). I suggest you try and use one of them to run and test your XSLT code.

The http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_choose is basically broken, it does not properly work with less than signs < as it basically reads out your entered code from a HTML textarea, then puts it into another one to then pass that content to an XML parser, however forgetting to properly escape the < sign twice (as that would be necessary with &lt; being an escape mechanism for both HTML and XML).

Vincevincelette answered 2/10, 2012 at 11:8 Comment(3)
You're right. W3 schools is broken. I tried Stylus Studio and it worked wonders. But now I am thinking... I could have just used a browser and test the rendering just by referencing the stylesheet. Thanks!Tapster
If you are going to continue to use the w3fools.com site, you can work around the bug with a test like... <xsl:when test="price &amp;lt; 10"> .Topotype
Ahaha Yeah I thought this site was better. Freaking discovery you made! Encoding the ampersand. Smart thiking :) I'll start using the stylus studio or the browser. We never know when something else stupid like this will show up! Thanks mateTapster
T
6

I had the same issue, but instead of painful escaping and ruining the "prettiness" of the code, it was a lot easier to replace <xsl:when test="$value <= 10"> with <xsl:when test="not($value > 10)">

Tyr answered 6/4, 2016 at 11:33 Comment(0)
B
-1

I'm not sure how 4 people answered a question about < not working in xslt xpath expressions, and managed to write paragraphs and paragraphs, yet failed to mention that if you want to use less than, you can simply type:

lt

as in:

$these-answers-are lt $complete
Beelzebub answered 30/9, 2022 at 16:55 Comment(3)
This question is tagged xslt-1.0. Your answer requires XSLT 2.0 or higher and will produce an error in XSLT 1.0. In addition, your statement that "if you want to use less than, you can simply type: lt" is incorrect (or at least incomplete) even in XSLT 2.0. The XPath 2.0 specification defines 2 sets of comparison operators: the lt operator is intended for value comparisons, while the < operator remains as a general comparison operator. ...Grozny
... In XPath 1.0, there is only the < operator - and in XSLT it must be escaped as &lt;. This form appears correctly in the question, so clearly - as has been pointed out in several comments, as well as in the accepted answer - the problem lies somewhere else. Perhaps you should look more closely before you criticize.Grozny
@michael.hor257k, well, my criticism got you to explain it in a more concise and complete and understandable manner than I've found anywhere else. So it was worth it. Now I get it. Thanks.Beelzebub
D
-2

None of your test data set seems to have any price less than 7.20 so there is no data to trigger the case

Dishpan answered 2/10, 2012 at 10:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.