我有以下部分生成的xsl以及带有重载方法的扩展类。 Xalan能够很好地改造它。但是,Saxon产生以下错误。我不确定为什么它无法使用两个String参数绑定到该方法。任何帮助表示赞赏。
有多个方法匹配函数调用 比较:lessThan,并且没有足够的类型信息 确定应该使用哪一个
<e>
<xsl:attribute name="n">dateTime</xsl:attribute>
<xsl:attribute name="m">f</xsl:attribute>`enter code here`
<xsl:attribute name="d">f</xsl:attribute>
<xsl:attribute name="field">t</xsl:attribute>
<xsl:variable name="index" select="indexr:getIndex($Indexr,'Timezone|dateTime ')"/>
<xsl:variable name="__resOfRule">
<xsl:variable name="Val1">
<xsl:value-of select="$_root/Timezone[1]/one[1]"/>
</xsl:variable>
<xsl:variable name="source0">
<xsl:variable name="fieldData">
<xsl:choose>
<xsl:when test="string-length($Val1) = 0">
<xsl:value-of select='string("M")'/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="TXSLTFormater:validateNTrimSourceString(concat('<element data="',$Val1,'"',' spath="Timezone|one"',' sIntr="2"',' sPres="1"',' justify="R"',' isDiscriminatorField="false"',' do3_10_3WsProcessing="false"',' WsProcessingMode="XML"',' tpath="Timezone|dateTime"/>'), 'Y', $ErrorListener,$index)" xmlns:TXSLTFormater="com.contivo.runtime.common.TXSLTFormater"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="string($fieldData)"/>
</xsl:variable>
<xsl:variable name="source1" select="substring($source0, 2)"/>
<xsl:variable name="source2" select="substring($source0, 1, 1)"/>
<xsl:variable name="Val2">
<xsl:value-of select="$_root/Timezone[1]/two[1]"/>
</xsl:variable>
<xsl:variable name="source3">
<xsl:variable name="fieldData">
<xsl:choose>
<xsl:when test="string-length($Val2) = 0">
<xsl:value-of select='string("M")'/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="TXSLTFormater:validateNTrimSourceString(concat('<element data="',$Val2,'"',' spath="Timezone|two"',' sIntr="1"',' sPres="200"',' justify="R"',' isDiscriminatorField="false"',' do3_10_3WsProcessing="false"',' WsProcessingMode="XML"',' tpath="Timezone|dateTime"/>'), 'Y', $ErrorListener,$index)" xmlns:TXSLTFormater="com.contivo.runtime.common.TXSLTFormater"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="string($fieldData)"/>
</xsl:variable>
<xsl:variable name="source4" select="substring($source3, 2)"/>
<xsl:variable name="source5" select="substring($source3, 1, 1)"/>
<xsl:variable name="target0">
<xsl:choose>
<xsl:when test="(ctvf:convertToNumber($source2) = 'M')">
<xsl:choose>
<xsl:when test="(concat('a', $source5) = concat('a', 'M'))">
<xsl:choose>
<xsl:when test="((Compare:lessThan(ctvf:convertToNumber($source1),$source4)))">
<xsl:value-of select=""true""/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select=""false""/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="TXSLTFormater:WriteOut($errorFile, string($source4))" xmlns:TXSLTFormater="com.contivo.runtime.common.TXSLTFormater"/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="TXSLTFormater:WriteOut($errorFile, string($source1))" xmlns:TXSLTFormater="com.contivo.runtime.common.TXSLTFormater"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$target0"/>
</xsl:variable>
<xsl:if test="$__resOfRule != ''">
<xsl:variable name="__resOfVal">
<xsl:value-of select="TXSLTFormater:validateNTrimSourceString(concat('<element data="',$__resOfRule,'"',' tIntr="1"',' tPres="203"',' minSize="19"',' maxSize="2147483647"', ' facetEnabled="false"',' tpath="Timezone|dateTime"/>'), 'N',$ErrorListener,$index)" xmlns:TXSLTFormater="com.contivo.runtime.common.TXSLTFormater"/>
</xsl:variable>
<xsl:choose>
<xsl:when test='substring($__resOfVal, 1, 1) = "M"'>
<xsl:value-of select="substring($__resOfVal, 2)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="TXSLTFormater:WriteOut($errorFile, substring($__resOfVal, 2))" xmlns:TXSLTFormater="com.contivo.runtime.common.TXSLTFormater"/>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</e>
</e>
<xsl:function name="ctvf:convertToNumber">
<xsl:param name="val"/>
<xsl:variable name="strVal" select="string($val)"/>
<xsl:choose>
<xsl:when test="starts-with($strVal,'M')">
<xsl:value-of select="$strVal"/>
</xsl:when>
<xsl:when test="string(number($strVal)) = 'NaN'">
<xsl:value-of select="''"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$strVal"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
`
Java扩展类方法
/**`
***********************************************************************************************************
*
* @param operandA
* @param operandB
*
* @return
*/
public static final boolean lessThan(final String operandA, final String operandB)
{
return (operandA != null) && (operandB != null) && (operandA.compareTo(operandB) < 0);
}
/**
***********************************************************************************************************
*
* @param operandA
* @param operandB
*
* @return
*/
public static final boolean lessThan(final String operandA, final double operandB)
{
return lessThan(operandA, String.valueOf(operandB));
}
/**
***********************************************************************************************************
*
* @param operandA
* @param operandB
*
* @return
*/
public static final boolean lessThan(final double operandA, final String operandB)
{
return lessThan(String.valueOf(operandA), operandB);
}
答案 0 :(得分:1)
没有特别的理由期望Saxon和Xalan在这里以相同的方式工作:扩展函数在规范中完全由实现定义,并且Saxon的方法旨在与更多工作一起使用精心设计的XSLT 2.0类型系统。
Saxon的机制尝试区分多态方法,但只有在有足够的静态类型信息时才能这样做。据我所知,你的代码中没有单一的类型声明,所以撒克逊没有太多的东西可以继续下去。我猜想一个名为convertToNumber的函数返回一个数字,但它实际上似乎返回一个无类型的文本节点,并且根本没有任何东西可以继续。将convertToNumber的返回类型声明为xs:string(如果这真的是你想要的!)可能就够了。