Sunday, 17 July 2011

Boolean Operator Usage Example

XPath Boolean Operators

You can also use the and and or operators within your XPath expressions. These are referred to as "boolean operators", as they only test for "true" or "false". Numbers return false if they are zero, otherwise they return true. Empty strings (i.e. "") return false, otherwise they return true.

Boolean Operator Usage Example

The Source XML File

Using the same XML file, containing 13 food items and their associated nutritional value:

 <?xml version="1.0"?> <food_list>   <food_item type="vegetable">     <name>Agar</name>     <carbs_per_serving>81</carbs_per_serving>     <fiber_per_serving>8</fiber_per_serving>     <fat_per_serving>0.5</fat_per_serving>     <kj_per_serving>1280</kj_per_serving>   </food_item>   <food_item type="vegetable">     <name>Asparagus</name>     <carbs_per_serving>1</carbs_per_serving>     <fiber_per_serving>1</fiber_per_serving>     <fat_per_serving>0</fat_per_serving>     <kj_per_serving>40</kj_per_serving>   </food_item>   <food_item type="vegetable">     <name>Cabbage</name>     <carbs_per_serving>0</carbs_per_serving>     <fiber_per_serving>1</fiber_per_serving>     <fat_per_serving>0</fat_per_serving>     <kj_per_serving>14</kj_per_serving>   </food_item>   <food_item type="vegetable">     <name>Potato</name>     <carbs_per_serving>21.5</carbs_per_serving>     <fiber_per_serving>2</fiber_per_serving>     <fat_per_serving>1</fat_per_serving>     <kj_per_serving>460</kj_per_serving>   </food_item>   <food_item type="vegetable">     <name>Pumpkin</name>     <carbs_per_serving>6</carbs_per_serving>     <fiber_per_serving>1</fiber_per_serving>     <fat_per_serving>0.5</fat_per_serving>     <kj_per_serving>150</kj_per_serving>   </food_item>   <food_item type="vegetable">     <name>Yam</name>     <carbs_per_serving>30.5</carbs_per_serving>     <fiber_per_serving>2</fiber_per_serving>     <fat_per_serving>0.5</fat_per_serving>     <kj_per_serving>550</kj_per_serving>   </food_item>   <food_item type="vegetable">     <name>Zucchini</name>     <carbs_per_serving>1.5</carbs_per_serving>     <fiber_per_serving>1.5</fiber_per_serving>     <fat_per_serving>0.5</fat_per_serving>     <kj_per_serving>55</kj_per_serving>   </food_item>   <food_item type="seafood">     <name>Abalone</name>     <carbs_per_serving>0</carbs_per_serving>     <fiber_per_serving>0</fiber_per_serving>     <fat_per_serving>1</fat_per_serving>     <kj_per_serving>400</kj_per_serving>   </food_item>   <food_item type="seafood">     <name>Barramundi</name>     <carbs_per_serving>0</carbs_per_serving>     <fiber_per_serving>0</fiber_per_serving>     <fat_per_serving>2</fat_per_serving>     <kj_per_serving>390</kj_per_serving>   </food_item>   <food_item type="fruit">     <name>Apple</name>     <carbs_per_serving>15</carbs_per_serving>     <fiber_per_serving>2.5</fiber_per_serving>     <fat_per_serving>0</fat_per_serving>     <kj_per_serving>250</kj_per_serving>   </food_item>   <food_item type="fruit">     <name>Kiwi Fruit</name>     <carbs_per_serving>7.5</carbs_per_serving>     <fiber_per_serving>2.5</fiber_per_serving>     <fat_per_serving>0</fat_per_serving>     <kj_per_serving>150</kj_per_serving>   </food_item>   <food_item type="grain">     <name>Oatbran</name>     <carbs_per_serving>62</carbs_per_serving>     <fiber_per_serving>14</fiber_per_serving>     <fat_per_serving>7</fat_per_serving>     <kj_per_serving>1400</kj_per_serving>   </food_item>   <food_item type="grain">     <name>Wheatgerm</name>     <carbs_per_serving>1.5</carbs_per_serving>     <fiber_per_serving>1</fiber_per_serving>     <fat_per_serving>0.5</fat_per_serving>     <kj_per_serving>70</kj_per_serving>   </food_item> </food_list> 

The Requirement

This time, we will only display items that are either vegetables or fruit (remember, we have specified this using the "type" attribute). Like this:

XPath boolean operator example

The Solution

We could modify the code to test the value of the "type" attribute. We could achieve this using the XPath or operator to test that the value contains "vegetable" or "fruit", as follows:

 <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:template match="/">   <xsl:apply-templates/> </xsl:template>  <xsl:template match="food_list">   <table border="1"  style="background-color:#cccc00">     <tr>       <th>Node Position</th>       <th>Food Item</th>       <th>Carbs (g)</th>       <th>Fiber (g)</th>       <th>Fat (g)</th>       <th>Energy (kj)</th>     </tr>     <xsl:for-each select="food_item[(@type = 'vegetable') or (@type = 'fruit')]">       <tr>         <td><b><xsl:value-of select="position()"/></b></td>         <td><xsl:value-of select="name"/></td>         <td><xsl:value-of select="carbs_per_serving"/></td>         <td><xsl:value-of select="fiber_per_serving"/></td>         <td><xsl:value-of select="fat_per_serving"/></td>         <td><xsl:value-of select="kj_per_serving"/></td>       </tr>     </xsl:for-each>   </table> </xsl:template>  </xsl:stylesheet> 

No comments:

Post a Comment