Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Xpath XSLT函数返回类型_Xpath_Xslt 2.0 - Fatal编程技术网

Xpath XSLT函数返回类型

Xpath XSLT函数返回类型,xpath,xslt-2.0,Xpath,Xslt 2.0,最初:*如何将XPath查询应用于类型为element()的XML变量*** 我希望对XSLT2.0中传递给函数的变量应用XPath查询 Saxon返回此错误: Type error at char 6 in xsl:value-of/@select on line 13 column 50 of stackoverflow_test.xslt: XTTE0780: Required item type of result of call to f:test is element(); su

最初:*如何将XPath查询应用于类型为element()的XML变量***

我希望对XSLT2.0中传递给函数的变量应用XPath查询

Saxon返回此错误:

Type error at char 6 in xsl:value-of/@select on line 13 column 50 of stackoverflow_test.xslt:
  XTTE0780: Required item type of result of call to f:test is element(); supplied value has item type text()
程序的这个框架被简化了,但在开发结束时,它意味着将一个元素树传递给多个XSLT函数。每个函数都将从树中提取某些统计信息并创建报告

当我说应用XPath查询时,我的意思是希望查询考虑变量中的基本元素…如果你愿意。。。好像我可以写{count(doc(“我的XSLT树/元素变量”)/a[1])

使用萨克森9.7.0.5

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="f:f">
  <xsl:template match="/root">
    <xsl:variable name="first" as="element()*">
      <xsl:copy-of select="(./a[1])" />
    </xsl:variable>
    <html>
      <xsl:copy-of select="f:test($first)" />
    </html>
  </xsl:template>
  <xsl:function name="f:test" as="element()*">
    <xsl:param name="frstElem" as="element()*" />
    <xsl:value-of select="count($frstElem/a)" />
    <!-- or any XPath expression -->
  </xsl:function>
</xsl:stylesheet>

一些示例数据

<root>
    <a>
        <b>
            <c>hi</c>
        </b>
    </a>
    <a>
        <b>
            <c>hi</c>
        </b>
    </a>
</root>


您所做的是完全正确的,除了您已将
元素传递给函数,并且函数正在查找该元素的
子元素,并且使用示例数据将返回一个空序列。

如果需要
f:test()
要返回序列中
a
元素的数量,即
$frstElem
的值,可以使用以下命令

<xsl:value-of select="count($frstElem/self::a)" />


不要使用(隐式)
子对象::
轴。

那么您希望得到哪种结果?您传入一个
a
元素,该元素有一个子元素
b
count($frstElem/a)
的结果应该是0。我编辑了一点问题:谢谢您的输入。这给了我信心,我在正确的轨道上,但编译器并不关心…我编辑了一点问题:谢谢你的输入。这给了我信心,我在正确的轨道上,但编译器并不关心这一点。…。@P.Coltharp:好的。通常,如果您遇到错误消息,请发布错误消息。我们看不见的东西帮不了你。在本例中,您有一个类型错误,因为您将函数声明为返回类型
element()*
,但函数体生成一个
text()
值(
xsl:value of
,带有一个
count()
表达式,它给出一个数字)。您希望它返回元素还是数字?如果希望它返回
a
元素,请用
替换
xsl:value的
。学到的教训(复数),先生,谢谢。@P.Coltharp:明白,我以前也经历过同样的事情。很高兴我们能帮忙。我认为这是一个很好的教训,即使你认为你知道问题所在,你也会发布你如何知道问题所在的信息。在为一个问题帖子收集信息的过程中,我经常发现一些我忽略的东西。我对这个问题做了一些编辑:谢谢你的输入。这给了我信心,我在正确的轨道上,但编译器并不关心。。。