序列类型语法和联合类型

sequence type syntax and union types

提问人:MrD at KookerellaLtd 提问时间:11/15/2023 最后编辑:MrD at KookerellaLtd 更新时间:11/15/2023 访问量:27

问:

我正在努力寻找一个很好的解释,说明XSLT 3+中的变量类型是可能的,什么是不可能的(我相信它使用XPath序列类型语法)

如果我有一个模板/函数/变量是 Foo 类型的元素,我会这样做

<xsl:variable name="foo" as="element(Foo)*">
    <Foo/>
</xsl:variable>

我的具体问题是用注释注释一些输出(实际上是在模板中,但变量就可以了),但问题是一般的:

<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

有没有办法定义联合类型?

XPath XSLT-3.0

评论


答:

1赞 Martin Honnen 11/15/2023 #1

有序列类型,然后是节点序列或 .node()node()*node()+

评论

0赞 MrD at KookerellaLtd 11/15/2023
但你不能说“(comment() |元素(Foo))*“?
0赞 Martin Honnen 11/15/2023
@MrDatKookerellaLtd,请看 Michael Kay 的回答。
0赞 MrD at KookerellaLtd 11/15/2023
我会在陪审团的分歧决定中把它交给迈克尔:-)
2赞 Michael Kay 11/15/2023 #2

XSLT 3.0(或 XPath 3.0)中的类型系统不包括一般联合运算符。您可以定义任意两个原子类型的并集,但不能定义其他类型(如节点类型、数组类型或映射类型)的并集。你能做的最好的事情就是使用“最不常见的超类型”,即 和 是 。element()comment()node()

XSLT 匹配模式允许 ,但这是一种匹配模式,而不是项类型,因此不能在属性中使用。match="element()|comment()"as