Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if element node contains a specific value in xsl

I have an XML document:

<?xml version="1.0" encoding="ISO-8859-1"?>
<document>
    <fruits>
        <fruit id="1">
            <title>I like pineapples</title>
            <description> a tropical plant with edible multiple fruit consisting of coalesced berries</description>
        </fruit>
        <fruit id="2">
            <title>I like watermelons</title>
            <description>has a smooth exterior rind (green, yellow and sometimes white) and a juicy, sweet interior flesh</description>
        </fruit>
    </fruits>
</document>

How do I check if the title element contains 'pineapple' so that i can only display description for that particular fruit ?

Here is the XSLT transformation I have:

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output  method="xml" omit-xml-declaration="yes" doctype-public="-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
             doctype-system="http://www.wapforum.org/DTD/xhtml-mobile10.dtd"/>
 <xsl:template match="/">
    <xsl:element name="html">
      <xsl:element name="head">        
        <xsl:element name="title">Fruits</xsl:element>
      </xsl:element>

      <xsl:element name="body">
        <xsl:if test="/document/fruits/fruit/title[contains(text(),'pineapple')]">
          <xsl:value-of select="description"/>
        </xsl:if>
        </xsl:element>
    </xsl:element>
  </xsl:template>
 </xsl:stylesheet>
like image 474
Sujal Avatar asked Dec 26 '22 06:12

Sujal


2 Answers

Here's a slightly more push-driven approach that accomplishes what you want.

When this XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
  <xsl:output omit-xml-declaration="no" indent="yes"
  doctype-public="-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
  doctype-system="http://www.wapforum.org/DTD/xhtml-mobile10.dtd" />
  <xsl:strip-space elements="*" />

  <xsl:template match="/*">
    <html>
      <head>
        <title>Fruits</title>
      </head>
      <body>
        <xsl:apply-templates
          select="fruits/fruit[contains(title, 'pineapple')]" />
      </body>
    </html>
  </xsl:template>

  <xsl:template match="fruit">
    <xsl:apply-templates select="description" />
  </xsl:template>
</xsl:stylesheet>

...is applied to the provided XML:

<?xml version="1.0" encoding="utf-8"?>
<document>
  <fruits>
    <fruit id="1">
      <title>I like pineapples</title>
      <description>a tropical plant with edible multiple fruit
      consisting of coalesced berries</description>
    </fruit>
    <fruit id="2">
      <title>I like watermelons</title>
      <description>has a smooth exterior rind (green, yellow and
      sometimes white) and a juicy, sweet interior
      flesh</description>
    </fruit>
  </fruits>
</document>

...the wanted result is produced:

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>Fruits</title>
  </head>
  <body>a tropical plant with edible multiple fruit consisting of coalesced berries</body>
</html>
like image 144
ABach Avatar answered Dec 29 '22 12:12

ABach


A simpler and almost fully "push style" solution:

<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="/*">
    <html>
      <head>
        <title>Fruits</title>
      </head>
      <body><xsl:apply-templates/></body>
    </html>
 </xsl:template>

 <xsl:template match="fruit[contains(title, 'pineapple')]">
  <xsl:value-of select="description"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

When this transformation is applied on the provided XML document:

<document>
    <fruits>
        <fruit id="1">
            <title>I like pineapples</title>
            <description> a tropical plant with edible multiple fruit consisting of coalesced berries</description>
        </fruit>
        <fruit id="2">
            <title>I like watermelons</title>
            <description>has a smooth exterior rind (green, yellow and sometimes white) and a juicy, sweet interior flesh</description>
        </fruit>
    </fruits>
</document>

the wanted, correct result is produced:

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

      <title>Fruits</title>
   </head>
   <body> a tropical plant with edible multiple fruit consisting of coalesced berries</body>
</html>
like image 22
Dimitre Novatchev Avatar answered Dec 29 '22 10:12

Dimitre Novatchev