2011-05-11 76 views
3

我想寫一個返回特定類型的結果的XSLT 2.0函數 - 讓我們說一個或多個元素。這是我已經試過了,沒有效果:XSLT 2.0函數可以返回任意類型嗎?

<xsl:function name="util:find-parents2" as="element(parent)*"> 
    <xsl:variable name="output" as="element(parent)*"> 
     <xsl:for-each select="('one','two')"> 
     <parent> 
      <xsl:sequence select="."/> 
     </parent> 
     </xsl:for-each> 
    </xsl:variable> 
    <xsl:value-of select="$output"/> 
    </xsl:function> 

這是我從撒克遜處理器得到錯誤:

Error at xsl:function on line 192 column 65 of file:/e:/mlsh/recursive.xsl: 
    XTTE0780: Required item type of result of function util:find-parents2() is element(parent, 
    xs:anyType); supplied value has item type text() Failed to compile stylesheet. 1 error detected. 

但我希望得到的東西是這樣的:

<parent>one</parent> 
<parent>two</parent> 

我在這裏錯過了什麼?我以爲我已經爲$輸出指定了適當的類型(一個或多個<parent>元素),但處理器顯然沒有收到消息,只能看到文本。如何在此處返回<parent>元素的列表?在此先感謝...

UPDATE:

彙總,答案在標題的問題是「是」。原始示例中的關鍵是<xsl:value-of><xsl:sequence>之間的差異。用後者取代前者是獲得理想行爲的一種方式。另一種方法是將「解包」從<xsl:variable>元素的內容,這使得事情有點整潔:

<xsl:function name="util:find-parents2" as="element(parent)*"> 
    <xsl:for-each select="('one','two')"> 
     <parent> 
     <xsl:sequence select="."/> 
     </parent> 
    </xsl:for-each> 
    </xsl:function> 

感謝Michael和Jim追趕我原來的監督......

回答

3

我相信問題是你應該刪除最後的<xsl:value-of...>value-of產生一個文本節點,這不是你想要的。序列構造函數已經包含你想輸出的節點。

+0

啊,謝謝!我經常養成使用xsl:value-of的習慣,​​這通常會產生我想要的類型(文本節點)。但正如你所說的,xsl:value-of總是給出文本表示,而xsl:sequence則產生任意類型。 – Ignatius 2011-05-11 18:42:13

+3

實際上,如果沒有函數的xsl:value - 只包含一個xsl:變量,那麼它會產生一個空的結果。但是答案大致是正確的:xsl:value-of是一個用詞不當的東西,因爲它將所有東西都縮減爲文本節點。認爲xsl:序列。 – 2011-05-11 20:03:45