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: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>
于 2012-04-24T12:25:33.053 に答える
6

あなたは単に欲しい

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

の代わりにxsl:if

于 2012-04-24T11:48:42.900 に答える