Reputation: 11
A question about XML & XSL (I am using sharepoint 2007)
How do you compare two nodes?
In the example below I want to compare 'promotionprice' with 'price'.
If the 'promotionprice' equals or is greater than 'price' then 'OK' should be "NO". If the 'promotionprice' lesser than 'price' then 'OK' should be "YES".
I am not sure I am using the correct syntax because in sharepoint it does not work, it always gives YES.
XML example:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<promotionprice>15.00</promotionprice>
<year>1985</year>
<OK>Yes</OK>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<promotionprice>5.00</promotionprice>
<year>1988</year>
<OK>Yes</OK>
</cd>
</catalog>
XSL example:
...
<!-- title node -->
<td>
<xsl:value-of select="@title"/>
</td>
<!-- artist node -->
<td>
<xsl:value-of select="@artist"/>
</td>
...
<!-- OK node -->
<td>
<xsl:choose>
<xsl:when test="promotionprice >= price">
<xsl:value-of select="'NO'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'YES'"/>
</xsl:otherwise>
</xsl:choose>
</td>
WANTED RESULT:
<table border="1">
<tr>
<td>Empire Burlesque</td>
<td>Bob Dylan</td>
<td>USA</td>
<td>Columbia</td>
<td>10.90</td>
<td>15.00</td>
<td>1985</td>
<td>NO</td>
</tr>
<tr>
<td>Hide your heart</td>
<td>Bonnie Tyler</td>
<td>UK</td>
<td>CBS Records</td>
<td>9.90</td>
<td>5.00</td>
<td>1988</td>
<td>YES</td>
</tr>
</table>
Thanks A LOT in advance!
Upvotes: 1
Views: 1922
Reputation: 243449
This transformation:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<table border="1">
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="cd">
<tr><xsl:apply-templates/></tr>
</xsl:template>
<xsl:template match="title|artist">
<td><xsl:value-of select="."/></td>
</xsl:template>
<xsl:template match="OK">
<td>
<xsl:value-of select=
"substring('YESNO', 4 -3*(../price >= ../promotionprice),3)"/>
</td>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
when applied on the provided XML document:
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<promotionprice>15.00</promotionprice>
<year>1985</year>
<OK>Yes</OK>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<promotionprice>5.00</promotionprice>
<year>1988</year>
<OK>Yes</OK>
</cd>
</catalog>
produces what I guess is the wanted result:
<table border="1">
<tr>
<td>Empire Burlesque</td>
<td>Bob Dylan</td>
<td>NO</td>
</tr>
<tr>
<td>Hide your heart</td>
<td>Bonnie Tyler</td>
<td>YES</td>
</tr>
</table>
Upvotes: 1