拥有这样的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文档,并且针对对此信息感兴趣的特定方。例如,有一些能够显示/呈现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:...)
更新
display:
,storage:
等的任何问题,因为:
xmlns:display=xxx
),突然在编辑文档时有一堆新属性,xmlns:display=xxx xmlns:storage=yyy
以及需要的任何内容并在将来定义)如果说明从一开始就不清楚,请跟我说。
答案 0 :(得分:2)
如果无法查看现有架构,很难对您的问题给出明确的答案。但是可以描述一些简单的案例:
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。在最糟糕的情况下,您需要编写一个单一的驱动程序&#39;除了加载适当的模式文档集之外什么都不做的文档。
<xsd:schema xmlns:xsd="..."
...
>
<xsd:include schemaLocation="schema.xsd"/>
<xsd:import namespace="http://example.com/nss/display"
schemaLocation="display.xsd"/>
...
</
对于这种情况,您需要编写一个包含现有模式的模式文档,并使用您要使用的属性扩展相应的类型。
架构作者已采取措施阻止您在使用原始架构文档时执行您想要执行的操作。
复制现有架构,更改有问题的类型以允许或要求您要添加的属性,并在希望对其进行验证时使用原始架构,并在您希望对其进行验证时使用修改后的架构。当原始架构发生更改时,您需要镜像复制架构中的更改,以便保留原始架构与本地版本之间的所需关系。
此处,架构作者也试图阻止您希望执行的扩展类型;您的解决方案是再次复制架构文档并修改您的副本。
我正在阅读有关命名空间,XSD和扩展类型的内容,但我担心它只允许扩展类型,因此我可以指定多个注释(display:,storage:...)
您提到的唯一修改是扩展。你完全正确的类型扩展只允许扩展。要限制类型,必须使用类型限制。如果原始模式允许,则可以跨模式文档边界执行扩展和限制。