注释或添加外部数据 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 和扩展类型的内容,但恐怕它只允许扩展类型,所以我无法指定多个注释(显示:、存储:。 ..)
更新:
- 我可以修改现有架构 - 这没问题。但关键是,它不应该对
display:
、storage:
等一无所知,因为:
- 只有一些文档会使用附加属性(如显示)。
- 这些新属性将来可能会在主架构修复后添加。想象一下,开发人员正在创建一个新软件,该软件使用这些 XML 文件并请求其他信息。他们会以某种方式同意正在创建文档的人并在其中包含此附加信息,而无需修改系统的其余部分和主要 XSD.
- XML 文件是手工创建的。实际上 XSD 的主要原因是为了帮助编辑,错误立即下划线,关键字补全等
- 一个完美的解决方案是:
- 为了能够仅添加一些其他命名空间 (
xmlns:display=xxx
),然后在编辑文档时突然有一堆新属性可用,
- 能够添加其中的多个(
xmlns:display=xxx xmlns:storage=yyy
以及将来需要和定义的任何内容)
如果一开始描述的不清楚,请见谅。
由于无法查看现有架构,因此很难对您的问题给出明确的答案。但是可以描述一些简单的情况:
- 现有模式在您关心的元素上具有宽松的属性通配符,因此(例如)
display:layout
在 struct
上被接受,display:hidden
在 variable
上被接受,并且您可以在不验证扩展属性的情况下生活。
在这种情况下,无需执行任何操作。与现有模式和平相处地使用您的扩展属性。
- 现有模式在您关心的元素上具有属性通配符,因此(例如)
display:layout
在 struct
上被接受,display:hidden
在 variable
上被接受,并且您希望让验证器检查扩展属性的语法正确性,或者所讨论的通配符是严格的。
在这种情况下,您需要为扩展属性使用的命名空间编写架构文档,并确保在验证时将它们与现有架构一起加载。首先,您可能有一个类似这样的模式文档:
<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"/>
...
</
- 现有模式没有内置扩展点,但确实为您关心的元素使用顶级(命名)类型,并且不禁止扩展这些顶级类型。
对于这种情况,您需要编写一个架构文档,其中包含现有文档并使用您要使用的属性扩展适当的类型。
- 现有架构没有内置扩展点;它为您关心的元素使用顶级(命名)类型,但禁止扩展这些顶级类型。
架构作者已采取措施防止您在使用原始架构文档时为所欲为。
复制现有模式,更改有问题的类型以允许或要求您要添加的属性,并在您希望对其进行验证时使用原始模式,并在您希望对其进行验证时使用修改后的模式那。当原始架构发生变化时,您将需要在复制的架构中镜像更改,以保留原始架构与本地版本之间的所需关系。
- 原始模式对相关元素使用本地类型定义。
在这里,架构作者也试图阻止您希望执行的那种扩展;您的解决方案是再次复制架构文档并修改您的副本。
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:...)
您提到的唯一修改是扩展。你说得对,类型扩展只允许扩展。要限制类型,您必须使用类型限制。如果原始模式允许,扩展和限制都可以跨模式文档边界执行。
有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 和扩展类型的内容,但恐怕它只允许扩展类型,所以我无法指定多个注释(显示:、存储:。 ..)
更新:
- 我可以修改现有架构 - 这没问题。但关键是,它不应该对
display:
、storage:
等一无所知,因为:- 只有一些文档会使用附加属性(如显示)。
- 这些新属性将来可能会在主架构修复后添加。想象一下,开发人员正在创建一个新软件,该软件使用这些 XML 文件并请求其他信息。他们会以某种方式同意正在创建文档的人并在其中包含此附加信息,而无需修改系统的其余部分和主要 XSD.
- XML 文件是手工创建的。实际上 XSD 的主要原因是为了帮助编辑,错误立即下划线,关键字补全等
- 一个完美的解决方案是:
- 为了能够仅添加一些其他命名空间 (
xmlns:display=xxx
),然后在编辑文档时突然有一堆新属性可用, - 能够添加其中的多个(
xmlns:display=xxx xmlns:storage=yyy
以及将来需要和定义的任何内容)
- 为了能够仅添加一些其他命名空间 (
如果一开始描述的不清楚,请见谅。
由于无法查看现有架构,因此很难对您的问题给出明确的答案。但是可以描述一些简单的情况:
- 现有模式在您关心的元素上具有宽松的属性通配符,因此(例如)
display:layout
在struct
上被接受,display:hidden
在variable
上被接受,并且您可以在不验证扩展属性的情况下生活。
在这种情况下,无需执行任何操作。与现有模式和平相处地使用您的扩展属性。
- 现有模式在您关心的元素上具有属性通配符,因此(例如)
display:layout
在struct
上被接受,display:hidden
在variable
上被接受,并且您希望让验证器检查扩展属性的语法正确性,或者所讨论的通配符是严格的。
在这种情况下,您需要为扩展属性使用的命名空间编写架构文档,并确保在验证时将它们与现有架构一起加载。首先,您可能有一个类似这样的模式文档:
<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"/>
...
</
- 现有模式没有内置扩展点,但确实为您关心的元素使用顶级(命名)类型,并且不禁止扩展这些顶级类型。
对于这种情况,您需要编写一个架构文档,其中包含现有文档并使用您要使用的属性扩展适当的类型。
- 现有架构没有内置扩展点;它为您关心的元素使用顶级(命名)类型,但禁止扩展这些顶级类型。
架构作者已采取措施防止您在使用原始架构文档时为所欲为。
复制现有模式,更改有问题的类型以允许或要求您要添加的属性,并在您希望对其进行验证时使用原始模式,并在您希望对其进行验证时使用修改后的模式那。当原始架构发生变化时,您将需要在复制的架构中镜像更改,以保留原始架构与本地版本之间的所需关系。
- 原始模式对相关元素使用本地类型定义。
在这里,架构作者也试图阻止您希望执行的那种扩展;您的解决方案是再次复制架构文档并修改您的副本。
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:...)
您提到的唯一修改是扩展。你说得对,类型扩展只允许扩展。要限制类型,您必须使用类型限制。如果原始模式允许,扩展和限制都可以跨模式文档边界执行。