我有一个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节点集中生成一个虚拟元素,但是这里有更简洁的方法,还是抑制编译错误的方法?
答案 0 :(得分:1)
根据http://www.w3.org/TR/xslt20/#variable-values,“如果变量绑定元素具有空内容且既没有select属性也没有as属性,则提供的变量值是零长度字符串。”
所以你需要改变它,例如通过执行<xsl:variable name="patterns" select="()"/>
将空序列绑定为变量值。
答案 1 :(得分:0)
在XSLT 1.0中(同样适用于XSLT 2.0)使用:
<xsl:variable name="patterns" select="/.."/>
这为XSLT处理器提供了必要的信息,以确定$patterns
变量的类型是 node-set 。