如何创建一个返回布尔值的xsl:function

时间:2012-04-24 11:26:37

标签: function xslt xslt-2.0

我想用一些可以返回布尔值的参数创建一个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> 

2 个答案:

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