我想用一些可以返回布尔值的参数创建一个xsl:function,我遇到了麻烦:
<xsl:if test="my:isEqual($Object1, $Object2)">SAME!</xsl:if>
<xsl:function name="my:isEqual">
<xsl:param name="Object1" />
<xsl:param name="Object2" />
<xsl:variable name="Object1PostalCode select="$Object1/PostalCode" />
<xsl:variable name="Object2PostalCode select="$Object2/PostalCode" />
<xsl:if test="$Object1PostalCode = $Object2PostalCode">
!!!What to do here!!!
</xsl:if>
</xsl:function>
答案 0 :(得分:8)
我想用一些可以返回的参数创建一个xsl:function 一个布尔,我遇到了麻烦:
<xsl:function name="my:isEqual">
你的麻烦甚至在这里开始。如上所述,没有任何保证此函数不会返回任何XDM类型的项目或项目序列。
要记住的规则:编写xsl:function
时请指定其返回类型。同时指定参数的类型。这使您免于运行时类型不匹配问题。它还为更强大和更积极的优化提供了机会。
所以,不要编写以下内容 - 您可能难以捕获运行时类型不匹配问题:
<xsl:function name="my:isEqual">
<xsl:param name="Object1" />
<xsl:param name="Object2" />
取而代之的是使用XSLT 2.0的全部功能并指定正确的类型:
<xsl:function name="my:isEqual" as="xs:boolean">
<xsl:param name="Object1" as="element()?" />
<xsl:param name="Object2" as="element()?" />
最后,代码结束:
<xsl:if test="$Object1PostalCode = $Object2PostalCode">
!!!What to do here!!!
</xsl:if>
</xsl:function>
只需返回comparisson - 它会精确评估true()
或false()
:
<xsl:sequence select="$Object1PostalCode eq $Object2PostalCode"/>
</xsl:function>
答案 1 :(得分:6)
你只想要
<xsl:sequence select="$Object1PostalCode = $Object2PostalCode"/>
而不是xsl:if
。