2012-04-24 101 views
3

我想创建一个XSL:有几个参数功能,可以返回一个布尔值,我遇到的麻烦:如何创建一个XSL:函数返回一个布尔

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

回答

8

我想创建一个XSL:函数,可以返回 一个布尔值几个参数,我遇到的麻烦:

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

大。然而,实际测试稍微复杂一点。是否允许这样做一个复杂的'选择' ? – 2012-04-24 12:47:34

+1

@BasHendriks:仍然一样 - 只是输出(评估)的测试,无论它有多复杂。 – 2012-04-24 13:17:16

+1

谢谢,很好的解释:) – Charles 2013-02-05 14:36:01

6

你只是想

<xsl:sequence select="$Object1PostalCode = $Object2PostalCode"/> 

而不是xsl:if

相关问题