2012-04-24 130 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

相關問題