4

我正在尝试编写一个返回特定类型结果的 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>

我在这里想念什么?我以为我已经为 $output (一个或多个<parent>元素)指定了适当的类型,但处理器显然没有收到消息并且只看到文本。如何<parent>在此处返回元素列表?提前致谢...

更新:

总而言之,标题中问题的答案是“是”。<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>

感谢迈克尔和吉姆抓住了我最初的疏忽……

4

1 回答 1

3

我相信问题是你应该删除 final <xsl:value-of...>value-of生成一个文本节点,这不是您想要的。序列构造函数已经包含您要输出的节点。

于 2011-05-11T18:13:05.420 回答