代码之家  ›  专栏  ›  技术社区  ›  rtd353

XSLT2.0错误检查表达式的类型

  •  0
  • rtd353  · 技术社区  · 2 年前

    XSLT 2.0

    我有一封电子邮件,它存储在文档数据库中,在下面表示为travEmail,我正在尝试检查小写travEmail是否以小写搜索查询开始,在下面显示为lowerSearchQuery,如果检查成功,则文档将添加到响应中

        <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>
    

    下面的代码检查电子邮件是否以lowerSearchQuery开头,它按预期编译并工作:

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

    但在文档DB中的电子邮件未存储为小写的情况下,当我将电子邮件转换为小写并与小写搜索查询进行比较时,它不起作用

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

    我得到以下编译错误“表达式的错误检查类型”

    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  
    

    事实上,当试图比较任意两个变量时,错误就会发生,而不仅仅是这两个

    1 回复  |  直到 2 年前
        1
  •  1
  •   Martin Honnen    2 年前

    这是一个字符串,你只要使用 starts-with($lowerEmail, $otherVar) 用于布尔表达式。在XPath1中,谓词作用于节点(集)s。