Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT2.0函数能否返回任意类型?_Xml_Xslt 2.0_Saxon - Fatal编程技术网

Xml XSLT2.0函数能否返回任意类型?

Xml XSLT2.0函数能否返回任意类型?,xml,xslt-2.0,saxon,Xml,Xslt 2.0,Saxon,我试图编写一个XSLT2.0函数,返回特定类型的结果——比如说一个或多个元素。以下是我尝试过的,但没有用: <xsl:function name="util:find-parents2" as="element(parent)*"> <xsl:variable name="output" as="element(parent)*"> <xsl:for-each select="('one','two')"> <pa

我试图编写一个XSLT2.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>
但我希望得到这样的东西:

<parent>one</parent>
<parent>two</parent>
1
二
我错过了什么?我以为我已经为$output(一个或多个
元素)指定了合适的类型,但是处理器显然没有收到消息,只看到文本。如何在此处返回
元素列表?先谢谢你

更新:

总而言之,标题中问题的答案是“是”。原始示例中的关键是
之间的区别。用后者代替前者是获得所需行为的一种方法。另一种方法是从
元素中“展开”内容,这会使事情变得更整洁:

  <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发现了我最初的疏忽…

我认为问题在于你应该删除最后的
value of
生成一个文本节点,这不是您想要的。序列构造函数已经包含您想要输出的节点。

Ah,谢谢!我经常习惯使用xsl:value of,它通常生成我想要的类型(文本节点)。但正如您所指出的,的xsl:value始终提供文本表示,而xsl:sequence生成任意类型。实际上,如果没有xsl:value,函数将只包含xsl:variable,因此它将生成空结果。但答案大体上是正确的:xsl:value of有点用词不当,因为它将所有内容简化为文本节点。想想xsl:sequence。
  <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>