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

最佳答案


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

简单地返回比较 - 它准确地评估为 true()false() :
    <xsl:sequence select="$Object1PostalCode eq $Object2PostalCode"/>
</xsl:function>

10-06 10:24