gpt4 book ai didi

xml - XSD 断言 : Multiply all values in sequence

转载 作者:行者123 更新时间:2023-12-02 00:27:57 26 4
gpt4 key购买 nike

我有一个 xml 文档,如下所示:

<Output>
<Integer start="0 0 0 0 0 0 0"/>
<Dimensions>
<Dimension value="2"/>
<Dimension value="3"/>
</Dimensions>
</Output>

我还有一个 XSD 文件,它定义了相应的结构。起始属性定义为整数列表。在这个 XSD 文件中,我想要一个断言,检查此列表中的值的数量是否等于 Dimension 元素的所有值属性的乘积。在这种情况下,必须在 start 中定义 2 * 3 = 6 个值。

它会是这样的

<xs:assert test="count(data(./Integer/@start)) = multiply(./Dimensions/Dimension/@value) "/>

我的问题是如何编写类似于和的乘法,但用乘法而不是加法。是否有可能向 XSD 文档添加功能?或者是否有可能重写断言测试来满足我的要求?

最佳答案

XSD 1.1 断言仅限于 XPath 2.0,这使得这变得很困难;无法访问 XPath 3.1 fold-left()函数,或用户定义的函数(这将允许递归)。

某些 XSD 1.1 处理器可能会解除此限制(您可以配置 Saxon 以允许 XPath 3.1),但这超出了规范。

如果您准备限制维度数量,您可以这样做

number(if (exists(Dimension[1])) then Dimension[1]/@value else 1) *
number(if (exists(Dimension[2])) then Dimension[2]/@value else 1) *
number(if (exists(Dimension[3])) then Dimension[3]/@value else 1) *
... etc

但我认为没有使用纯 XSD 1.1 + XPath 2.0 的通用解决方案。

启用 XPath 3.1 后,您可以做到

count(...) = fold-left(Dimension/@value, 1, 
function($total, $next){$total*number($next)})

关于xml - XSD 断言 : Multiply all values in sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53678059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com