注释或添加外部数据 XML

Annotate or add external data to XML

有XML这样的:

<interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xsi:noNamespaceSchemaLocation="../../schema.xsd">
  <struct name="Owner" type="Person" />
  <variable name="Timestamp" />
</interface>

我想为一些元素添加额外的属性,这些元素只有一些 XML 文档会使用,并且针对对此信息感兴趣的特定各方。例如,有一些组件能够 display/present 我要添加的 XML 文件:

有XML这样的:

<interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xsi:noNamespaceSchemaLocation="../../schema.xsd">
  <struct name="Owner" type="Person" display:layout="vertical" />
  <variable name="Timestamp" display:hidden="true" />
</interface>

我不想更改我的 XSD,因为此附加信息是某些特定于软件模块的信息,并不适用于所有文档。

如果可能的话,我想要其他 XSD 个文件来验证这个新信息。

我怎样才能做到这一点?

我正在阅读有关命名空间、XSD 和扩展类型的内容,但恐怕它只允许扩展类型,所以我无法指定多个注释(显示:、存储:。 ..)

更新:

如果一开始描述的不清楚,请见谅。

由于无法查看现有架构,因此很难对您的问题给出明确的答案。但是可以描述一些简单的情况:

  1. 现有模式在您关心的元素上具有宽松的属性通配符,因此(例如)display:layoutstruct 上被接受,display:hiddenvariable 上被接受,并且您可以在不验证扩展属性的情况下生活。

在这种情况下,无需执行任何操作。与现有模式和平相处地使用您的扩展属性。

  1. 现有模式在您关心的元素上具有属性通配符,因此(例如)display:layoutstruct 上被接受,display:hiddenvariable 上被接受,并且您希望让验证器检查扩展属性的语法正确性,或者所讨论的通配符是严格的。

在这种情况下,您需要为扩展属性使用的命名空间编写架构文档,并确保在验证时将它们与现有架构一起加载。首先,您可能有一个类似这样的模式文档:

<xsd:schema xmlns:xsd="..."
            xmlns:display="http://example.com/nss/display"
            targetNamespace="http://example.com/nss/display"
            >
  <xsd:attribute name="layout" type="xsd:string"/>
  <xsd:attribute name="hidden" type="xsd:boolean"/>

</

为确保加载额外命名空间的架构文档,请检查验证器的 API 或 CLI。在最坏的情况下,您需要编写一个 'driver' 文档,它只加载适当的模式文档集。

<xsd:schema xmlns:xsd="..."  
            ...
            >
  <xsd:include schemaLocation="schema.xsd"/>
  <xsd:import namespace="http://example.com/nss/display"
    schemaLocation="display.xsd"/>
  ...
</
  1. 现有模式没有内置扩展点,但确实为您关心的元素使用顶级(命名)类型,并且不禁止扩展这些顶级类型。

对于这种情况,您需要编写一个架构文档,其中包含现有文档并使用您要使用的属性扩展适当的类型。

  1. 现有架构没有内置扩展点;它为您关心的元素使用顶级(命名)类型,但禁止扩展这些顶级类型。

架构作者已采取措施防止您在使用原始架构文档时为所欲为。

复制现有模式,更改有问题的类型以允许或要求您要添加的属性,并在您希望对其进行验证时使用原始模式,并在您希望对其进行验证时使用修改后的模式那。当原始架构发生变化时,您将需要在复制的架构中镜像更改,以保留原始架构与本地版本之间的所需关系。

  1. 原始模式对相关元素使用本地类型定义。

在这里,架构作者也试图阻止您希望执行的那种扩展;您的解决方案是再次复制架构文档并修改您的副本。

I'm reading about namespaces, XSD and extending types, but I'm afraid it only allows to extend types, so I would be able to specify multiple annotations (display:, storage:...)

您提到的唯一修改是扩展。你说得对,类型扩展只允许扩展。要限制类型,您必须使用类型限制。如果原始模式允许,扩展和限制都可以跨模式文档边界执行。