[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: How to dynamically evaluate an equation in the inp

Subject: Re: How to dynamically evaluate an equation in the input XML document?
From: "Mukul Gandhi mukulg@xxxxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 15 Jul 2021 06:04:49 -0000
Re:  How to dynamically evaluate an equation in the inp
On Thu, Jul 15, 2021 at 12:18 AM Roger L Costello costello@xxxxxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:


> I have XML documents like this:
>
> <Convert-to-Celsius>
>     <equation>(Fahrenheit - 32) * (5/9)</equation>
>     <variable>
>         <name>Fahrenheit</name>
>         <value>32</value>
>     </variable>
> </Convert-to-Celsius>
>
> The document contains an equation which might contain variables. If it
> does contain variables, then I need to fetch their values and replace the
> variables in the equation with their values and then compute the value of
> the equation.
>
> Have you done this kind of dynamic equation solving using XSLT? If so, how
> did you do it?
>

In an XSLT 2.0 environment with Saxon, I've attempted to do this as
following (examples that I've run are cited),

XSLT stylesheet,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                         xmlns:xs="http://www.w3.org/2001/XMLSchema"

                         xmlns:saxon="http://saxon.sf.net/"
                         xmlns:fn1="http://fn1"
                         exclude-result-prefixes="xs saxon fn1"
                         version="2.0">

   <xsl:output method="text"/>

   <xsl:template match="Input">
     <xsl:value-of
select="saxon:evaluate(fn1:constructFinalExpression(equation,
variable[1]))"/>
   </xsl:template>

   <xsl:function name="fn1:constructFinalExpression" as="xs:string">
      <xsl:param name="equation" as="xs:string"/>
      <xsl:param name="variable" as="element(variable)"/>

      <xsl:choose>
        <xsl:when test="$variable/following-sibling::variable">
           <xsl:sequence select="fn1:constructFinalExpression(
                                          replace($equation,
$variable/name, $variable/value),

$variable/following-sibling::variable[1])"/>
        </xsl:when>
        <xsl:otherwise>
           <xsl:sequence select="replace($equation, $variable/name,
$variable/value)"/>
        </xsl:otherwise>
      </xsl:choose>
   </xsl:function>

</xsl:stylesheet>

1) XML document input,

<Input>
  <equation>(Fahrenheit - 32) * (5 div 9)</equation>
  <variable>
    <name>Fahrenheit</name>
    <value>32</value>
  </variable>
</Input>

Transformation result,

0

2) XML document input,

<Input>
  <equation>(x + 5) * (y + 5) * z</equation>
  <variable>
    <name>x</name>
    <value>2</value>
  </variable>
  <variable>
    <name>y</name>
    <value>3</value>
  </variable>
  <variable>
    <name>z</name>
    <value>2</value>
  </variable>
</Input>

Transformation result,

112


I've observed that, for example, if the input equation contains the
division operator as '/' instead of 'div' (as in XPath), Saxon gives me
following errors,

XPTY0019: Required item type of first operand of '/' is node(); supplied
value has item type xs:integer



-- 
Regards,
Mukul Gandhi

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.