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