3

我有一个 XSL 程序,它反过来生成一个 XSL 程序,根据输入可能如下所示:

<xsl:variable name="patterns"/> <!--empty in this particular case-->

<xsl:template name="token">
    <xsl:for-each select="$patterns/pattern">
...

然后当我运行生成的样式表时,撒克逊人,保佑它的心,显然是在做某种静态分析并抱怨:

XPTY0019: Required item type of first operand of '/' is node(); supplied value has item type xs:string

甚至不会编译样式表。

我的解决方法是在 $patterns 节点集中生成一个虚拟元素,但是这里有没有更简洁的方法,或者抑制编译错误的方法?

4

2 回答 2

2

根据http://www.w3.org/TR/xslt20/#variable-values,“如果变量绑定元素的内容为空并且既没有 select 属性也没有 as 属性,那么提供的变量值是一个零长度的字符串。”。

所以你需要改变它,例如<xsl:variable name="patterns" select="()"/>将一个空序列绑定为变量值。

于 2012-12-28T09:53:01.847 回答
0

在 XSLT 1.0 中(同样适用于 XSLT 2.0)使用

<xsl:variable name="patterns" select="/.."/>

这为 XSLT 处理器提供了信息,这是推断$patterns变量类型为node-set所必需的。

于 2012-12-28T14:53:17.710 回答