【问题标题】:XSD : How to check that only last element contains attributesXSD:如何检查只有最后一个元素包含属性
【发布时间】:2020-07-14 05:23:48
【问题描述】:

我有一个 XML 文档:

<Feature> 
    <Filter> ... </Filter>
    <Filter> ... </Filter>
    <Filter isTargetFilter="true"> ... </Filter>
</Feature>

功能最多可容纳 3 个过滤器元素。

使用 XSD 我想检查只有最后一个过滤器元素将包含一个属性“isTargetFilter”。

没有其他过滤器元素可以包含此属性。

我没有找到任何可以帮助我的 XSD 表达式。

任何指针表示赞赏。

【问题讨论】:

  • 您可能无法控制 XML 格式,但这不是一种设计良好的格式。当然,在“过滤器”标签列表之后添加一个可选标签来保存这些信息会更简单吗?
  • @kimbert :这是一种可能的解决方案。

标签: xml xsd xsd-validation xml-validation xsd-1.1


【解决方案1】:

在 XSD(1.0 和 1.1)中,如果两个元素是同级元素并且具有相同的名称,那么它们必须具有相同的类型。 (这个约束叫做Element Declarations Consistent,如果你想查的话)。

因此,唯一的方法是使用 XSD 1.1 断言。在 Feature 元素上定义断言:

<xs:assert test="every $f in Filter[not(position()=last())] satisfies empty(@isTargetFilter)"/>
<xs:assert test="Filter[position()=last()][@isTargetFilter]"/>

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 2022-01-21
    • 2017-08-04
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多