【问题标题】:Making an xsd schema extensible with a typed element使用类型化元素使 xsd 模式可扩展
【发布时间】:2020-05-22 16:50:54
【问题描述】:

给定一个定义了某种类型元素的模式,是否可以允许该类型被扩展,但该扩展元素仍然是强类型的?换句话说,添加某种可以从外部架构中使用的扩展点来添加只能在该位置使用的元素?

假设架构看起来有点像:

<xs:schema …>
  <xs:element name="Match" type="tns:TNodeConstraint" />

  <xs:complexType name="TNodeConstraint">
    <xs:group ref="tns:Expression" />
  </xs:complexType>

  <xs:group name="Expression">
    <xs:choice>
      <xs:element name="And">
        <xs:complexType … />
      </xs:element>

      <xs:element name="Or">
        <xs:complexType … />
      </xs:element>

      <xs:element name="IsAbstract">
      <xs:element name="IsExtern">

      <!-- Some kind of extension point? -->
    </xs:choice>
  </xs:group>
</xs>

是否可以扩展Expression 组,以便第二个外部架构可以说我可以在这里接受IsMyCustomConstraint,但不能接受IsMyCustomSortOrder?所以这将是有效的:

<Match>
  <IsAbstract />
  <IsExtern />
  <IsMyCustomConstraint />
</Match>

但这会无效吗?

<Match>
  <IsAbstract />
  <IsExtern />
  <IsMyCustomSortOrder />
</Match>
  • 我不想使用xs:any,因为这会允许在约束可以去的地方放置“排序顺序”。
  • 我可以修改原始架构
  • 我可以控制IsMyCustomConstraintIsMyCustomSortOrder 的命名空间,它们是否匹配原始架构并不重要。

【问题讨论】:

    标签: xsd


    【解决方案1】:

    是否有可能允许扩展该类型,但仍要对该扩展元素进行强类型化?

    肯定的 - 此处通过示例详细描述了这一点:https://www.w3.org/TR/2000/WD-xmlschema-0-20000225/#DerivExt。据我所知,您只需要声明一个或多个复杂类型,它们是基本类型“TNodeConstraint”的扩展。

    XML 模式有一组丰富的工具来支持类型继承,包括:

    • 抽象基类型(使用前必须扩展或限制基类型)
    • 扩展(新类型允许比基本类型更多的值)
    • 限制(新类型允许的值少于基本类型)
    • 控制是否允许进一步的扩展/限制(最终/块属性)

    我认为没有必要为扩展使用单独的 XSD,尽管您可以根据需要使用。您可能会发现了解 xsi:type、抽象类型和块/最终属性很有用——所有这些都在上面提到的 XML Schema Part 0 - Primer 中进行了描述。

    【讨论】:

    • 但是如何将这种新类型的元素添加到 Expression 内的选项中?
    • 公平问题 - 您在问如何扩展选择组。我认为这个线程会很有用:stackoverflow.com/questions/9008622/…。你不能通过复杂的类型扩展only来做到这一点,但是可以创建可扩展的模式。您只需要了解很多有关 XML Schema 所允许的机制。
    • 谢谢。我确实尝试过基于替换组的解决方案,但遇到重复元素名称的问题,因为替换元素必须是全局的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2022-09-24
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多