参数值的必选项类型为node();提供的值具有xs:string项类型

  • 本文关键字:类型 xs string 选项 node 参数 xml xslt
  • 更新时间 :
  • 英文 :


我有下面的XML

<content.text.block>
<text.line>context1</text.line>
<text.line>context2</text.line>
<text.line>context3</text.line>
<text.line>context4</text.line>
<text.line>context5</text.line>
<text.line>context6</text.line>
<text.line suppress-flag="y">context7</text.line>
</content.text.block>

下面是我使用的xslt代码

<xsl:for-each select="$textline[not(@suppress-flag = 'y')]">
<xsl:call-template name="populatetextNumber">
<xsl:with-param name="textNumber" select="current()" as="node()"/>
</xsl:call-template>
</xsl:for-each>
<xsl:for-each select="$textline[@suppress-flag = 'y']">
<xsl:call-template name="populatetextNumber">
<xsl:with-param name="textNumber" select="current()" as="node()"/>
</xsl:call-template>
</xsl:for-each>

$textline包含"text.line"元素中的值。

每个人的第一个都很好。但是第二个for each抛出以下错误。

"参数$textNumber的值的必需项类型为node();提供的值具有项类型xs:string"。

对于没有任何属性的元素,代码似乎运行良好。但当涉及到具有属性的元素时,这是一个问题

使用"as="node()"也没有帮助

您的问题是命名模板populatetextNumber的参数textNumber与您为该参数传递的值(字符串)之间的类型不匹配。(这对你来说应该是显而易见的错误信息;如果不是,请再次阅读错误信息,直到你明白它在说什么。)

你说

$textline包含"text.line"元素中的值。

如果这是正确的(我想是正确的,因为它符合错误消息的内容),那么$textline将包含一个字符串或一系列字符串。用for对字符串序列进行迭代不会将任何字符串更改为树节点。

如果要将节点作为参数传递给模板populatetextNumber,请更改for each的select表达式以选择text.line元素,或者更改$textline的声明以使其成为元素序列,而不是字符串序列。

如果出于任何原因想要保持$textline和for的原样,则需要更改命名模板populatetextNumber以接受字符串而不是节点作为其textNumber参数的值。


注意,许多在Stack Overflow上回答问题的人不喜欢省略明显相关信息的问题。如果您包含变量$textline的声明(因为它的实际类型是问题的一部分),并且至少包含命名模板populatetextNumber的参数声明(因为其声明的类型是类型冲突的另一部分)。当你省略这样的信息时,Stack Overflow的一些读者会推断,你要么知道得不够多,无法提出连贯的问题(SO帮助文件中的好建议),要么你不够关心回答者给他们所需信息的时间。这种推断可能不公平,但它与您提供的所有信息都是一致的。

相关内容

最新更新