Xpath XSLT函数返回类型
最初:*如何将XPath查询应用于类型为element()的XML变量*** 我希望对XSLT2.0中传递给函数的变量应用XPath查询 Saxon返回此错误: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
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:明白,我以前也经历过同样的事情。很高兴我们能帮忙。我认为这是一个很好的教训,即使你认为你知道问题所在,你也会发布你如何知道问题所在的信息。在为一个问题帖子收集信息的过程中,我经常发现一些我忽略的东西。我对这个问题做了一些编辑:谢谢你的输入。这给了我信心,我在正确的轨道上,但编译器并不关心。。。