我有下面的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-每个抛出下面的错误。
参数$textNumber值的必需项类型是节点();所提供的值具有项目类型xs:string。
对于没有任何属性的元素,代码似乎工作得很好。但是,当涉及到具有属性的元素时,这是一个问题。
使用‘as=’节点()‘也没有帮助
发布于 2017-10-23 16:10:34
这里的问题是命名模板textNumber的参数populatetextNumber与该参数传递的值(即字符串)之间的类型不匹配。(从错误消息中可以看出这一点;如果不是,请再读一遍错误消息,直到您理解它在说什么。)
你说
$textline包含"text.line“元素中的值。
如果这是正确的(我猜是正确的,因为它符合错误消息的意思),那么$textline将包含一个字符串或一个字符串序列。使用for-每个字符串序列进行迭代,不会将其中的任何字符串转换为树节点。
如果要将模板populatetextNumber作为参数传递给节点,则更改for-each的select表达式以选择text.line元素,或者更改$textline的声明,使其成为元素序列,而不是字符串序列。
如果出于任何原因,您希望保留$textline和for -每个模板,则需要更改命名的模板populatetextNumber,以接受字符串而不是节点作为其textNumber参数的值。
请注意,许多回答堆栈溢出问题的人不喜欢忽略相关信息的问题。如果您包含了变量$textline的声明(因为它的实际类型是问题的一部分),并且至少包含了命名模板populatetextNumber的参数声明(因为声明的类型是类型冲突的另一部分),那么您的问题会更好(并且更有可能得到快速答案)。当您省略这样的信息时,Stack溢出的一些读者会推断,您要么不知道如何问一个连贯的问题(SO help files中的好建议),要么您不太关心回答者给他们提供所需信息的时间。这种推断可能不公平,但它与您提供的所有信息都是一致的。
https://stackoverflow.com/questions/46890267
复制相似问题