XSLT 3+变量类型疑问:能否用联合类型兼容元素与注释?
XSLT 3+ 变量类型定义的可行场景与联合类型解决方案
可行场景
当需要定义仅包含<Foo>元素的变量时,使用element(Foo)*作为类型约束完全可行,示例代码如下:
<xsl:variable name="foo" as="element(Foo)*"> <Foo/> </xsl:variable>
报错场景
如果变量内容同时包含注释节点和<Foo>元素,继续使用element(Foo)*会触发类型不匹配错误。比如下面的代码:
<xsl:variable name="foo" as="element(Foo)*"> <xsl:comment>Foo</xsl:comment> <Foo/> </xsl:variable>
在Saxon 11.4中会抛出错误:
the supplied value <!--...--> does not match. The supplied value is a comment node
解决方案:使用联合类型
完全可以通过联合类型解决这个问题。只需把变量的类型约束修改为注释节点与<Foo>元素的联合序列类型,这样序列中的注释和<Foo>元素都能符合类型要求。修改后的代码如下:
<xsl:variable name="foo" as="(element(Foo) | comment())*"> <xsl:comment>Foo</xsl:comment> <Foo/> </xsl:variable>
这里的(element(Foo) | comment())*表示变量值可以是任意数量(包括零个)的<Foo>元素或注释节点组成的序列,完美匹配所需的内容结构。
内容的提问来源于stack exchange,提问作者MrD at KookerellaLtd
相关产品推荐
相关产品推荐

