2011-05-11 41 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

相关问题