Search code examples
javaxsltxslt-2.0

XSLT 2.0 Error checking type of the expression


XSLT 2.0

I have an email which is stored in a document DB and denoted below as travEmail, I am trying to do a check to see if the lowercase travEmail starts with the lowercase search query, denoted as lowerSearchQuery below, and if the check is successful then the document will be added to the response

    <xsl:variable name="searchQuery" select = "/response/lst/lst/str[@name = 'q']" >
    </xsl:variable>
    <xsl:variable name="searchQueryAfter" select = "substring-after($searchQuery,'email:')" >
    </xsl:variable>
    <xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable>
    <xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
    <xsl:variable name="lowerSearchQuery" select="translate($searchQueryAfter, $uppercase, $lowercase)">
    </xsl:variable>

    <xsl:variable name="travEmail" select="arr[@name='email']/str"> 
    </xsl:variable>
    <xsl:variable name="lowerEmail" select="translate($travEmail, $uppercase, $lowercase)"> 
    </xsl:variable>

the below code which checks if email starts with lowerSearchQuery compiles and works as intended:

<xsl:if test="not(position() > $retLimit) and arr[@name='email']/str [starts-with(.,$lowerSearchQuery)]">

but does not work in cases where email in the document DB is not stored as lowercase, when i translate the email to lowercase and compare to the lowercase search query

<xsl:if test="not(position() > $retLimit) and $lowerEmail [starts-with(.,$lowerSearchQuery)]">

i get the below compilation error 'Error checking type of the expression'

Caused by: javax.xml.transform.TransformerConfigurationException: Error checking type of the expression 'filter-expr(variable-ref(lowerEmail/string), [pred(funcall(starts-with, [step("self", -1), variable-ref(lowerSearchQuery/string)]))])'.
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:988)
    at org.apache.camel.builder.xml.XsltBuilder.setTransformerSource(XsltBuilder.java:360)
    at org.apache.camel.component.xslt.XsltEndpoint.loadResource(XsltEndpoint.java:334)
    at org.apache.camel.component.xslt.XsltEndpoint.doStart(XsltEndpoint.java:388)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:3232)
    at org.apache.camel.impl.DefaultCamelContext.doAddService(DefaultCamelContext.java:1212)
    at org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:1173)
    at org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:1169)
    at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:586)
    ... 61 more
Caused by: Error checking type of the expression 'filter-expr(variable-ref(lowerEmail/string), [pred(funcall(starts-with, [step("self", -1), variable-ref(lowerSearchQuery/string)]))])'.
    at com.sun.org.apache.xalan.internal.xsltc.compiler.FilterExpr.typeCheck(FilterExpr.java:108)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.LogicalExpr.typeCheck(LogicalExpr.java:131)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.If.typeCheck(If.java:85)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:484)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.ForEach.typeCheck(ForEach.java:83)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:484)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.Template.typeCheck(Template.java:291)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode.typeCheckContents(SyntaxTreeNode.java:484)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.Stylesheet.typeCheck(Stylesheet.java:654)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.Parser.createAST(Parser.java:405)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:469)
    at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:557)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:947)
    ... 70 more  

in fact the error happens when trying to compare any two variables, not just these two


Solution

  • It is a string that you have, just use starts-with($lowerEmail, $otherVar) for your boolean expression. In XPath 1, a predicate works on node(set)s.