5

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

2 回答 2

11

我想创建一个带有一些可以返回布尔值的参数的 xsl:function,我遇到了麻烦:

<xsl:function name="my:isEqual"> 

你的麻烦甚至从这里开始。正如所写,没有任何东西可以保证此函数不会返回任何 XDM 类型的项目或项目序列。

要记住的规则:在编写xsl:functiondo 时指定其返回类型。还要指定参数的类型。这使您免于运行时类型不匹配的问题。它还为更强大和更积极的优化提供了机会。

所以,不要写以下内容——你可能很难发现运行时类型不匹配的问题

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

只需返回比较 - 它的计算结果完全为true()orfalse()

    <xsl:sequence select="$Object1PostalCode eq $Object2PostalCode"/>                     
</xsl:function>
于 2012-04-24T12:25:33.053 回答
6

你只是想要

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

而不是xsl:if.

于 2012-04-24T11:48:42.900 回答