我有以下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工作正常。但是第二个for-each抛出了以下错误。
“参数$ textNumber的值的必需项类型是node();提供的值具有项类型xs:string”。
对于没有任何属性的元素,代码似乎工作正常。但是当涉及具有属性的元素时,它就是一个问题
使用'as =“node()”'也没有帮助
答案 0 :(得分:1)
此处的问题是命名模板textNumber
的参数populatetextNumber
与您为该参数传递的值(类型为字符串)之间的类型不匹配。 (从错误消息中可以看出这一点很明显;如果没有,请再次阅读错误消息,直到您理解它的含义为止。)
你说
$ textline包含&#34; text.line&#34;中的值。元件。
如果这是正确的(我猜它是,因为它符合错误信息的说法),那么$ textline将包含一个字符串或一系列字符串。使用for-each迭代该字符串序列不会将它们中的任何一个更改为树节点。
如果要将模板populatetextNumber
作为参数传递,请更改for-each的select
表达式以选择text.line
元素,否则声明$textline
使其成为一系列元素,而不是一系列字符串。
如果由于某种原因你想保留$ textline和for-each,你需要更改命名模板populatetextNumber
以接受字符串而不是节点作为其{{的值1}}参数。
请注意,许多回答Stack Overflow问题的人不喜欢忽略明显相关信息的问题。如果你包含了变量textNumber
的声明(因为它的实际类型是问题的一部分)并且至少是命名模板的参数声明{你的问题会更好(并且更有可能获得快速答案) {1}}(因为它声明的类型是类型冲突的另一部分)。当你忽略这样的信息时,Stack Overflow的一些读者会推断你要么不知道问题一致(SO help files中的好建议),要么你不关心足够的回答者#39;是时候给他们所需要的信息了。这种推断可能不公平,但它与您提供的所有信息兼容。