【问题标题】:XML Schema assert loop validationXML Schema 断言循环验证
【发布时间】:2015-03-31 08:38:31
【问题描述】:

我的 XML 结构如下所示:

<myElement>
    <start>0</start>
</myElement>
<myElement>
    <start>5</start>
</myElement>
<myElement>
    <start>7</start>
</myElement>
<myElement>
    <start>14</start>
</myElement>

现在我的验证规则如下:每个“myElement”元素都将包含一个“start”元素。该元素的整数值不能小于前面的“myElement”->“start”。因此,例如这将是无效的:

<myElement>
    <start>14</start>
</myElement>
<myElement>
    <start>7</start>
</myElement>

这样的规则怎么可能看起来像xs:assert-元素?

【问题讨论】:

    标签: xml xsd assert assertion xsd-1.1


    【解决方案1】:

    是的,这是可能的。这样的断言应该符合您的需求:

    <xs:assert test="max(preceding::start) &lt; number(.) or empty(preceding::start)"></xs:assert>
    

    在第一部分,检查前面的最大start 值是否仍然低于正在检查的当前值。

    第二部分 (or empty(preceding::start)) 只是为了克服第一部分的失败,因为第一个 start 标签不会提供任何可比较的值。

    它应该以这种方式添加到您的关联架构中 - 包装 complexTypemyElement 的内容模型:

                   <xs:complexType>
                       <xs:sequence>
                           <xs:element name="start" type="xs:integer" />
                       </xs:sequence>
                       <xs:assert test="max(preceding::start) &lt; number(.) or empty(preceding::start)"></xs:assert>
                   </xs:complexType>
    

    【讨论】:

    • 能否请您稍微解释一下这个规则以及它应该放在 XML 中的什么位置?
    • 完成了。既然您在谈论 &lt;xs:assert&gt;,我假设您已经对 XML 模式很熟悉
    • 好答案。但我认为最好只使用 preceding::start[1] 与前一个 start 节点进行比较,而不是计算前一个 start的最大值> 节点。
    • @potarne 它工作得很好,但我对那个解决方案有一个问题。如果您有多个myElement-元素,那么如果start-元素的值小于前一个'myElement'-元素中的值,则此脚本将不起作用。这应该不是问题
    猜你喜欢
    • 2013-03-12
    • 2013-03-22
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多