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追趕我原來的監督......
啊,謝謝!我經常養成使用xsl:value-of的習慣,這通常會產生我想要的類型(文本節點)。但正如你所說的,xsl:value-of總是給出文本表示,而xsl:sequence則產生任意類型。 – Ignatius 2011-05-11 18:42:13
實際上,如果沒有函數的xsl:value - 只包含一個xsl:變量,那麼它會產生一個空的結果。但是答案大致是正確的:xsl:value-of是一個用詞不當的東西,因爲它將所有東西都縮減爲文本節點。認爲xsl:序列。 – 2011-05-11 20:03:45