我想创建一个XSD,它定义一个属性,该属性可以放在来自其他模式的元素或不在任何模式中的元素上.例如,架构看起来像这样:
<xs:schema id="MySchema" targetNamespace="http://tempuri.org/MySchema" elementFormDefault="qualified" xmlns="http://tempuri.org/MySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:attribute name="myAttribute" /> </xs:schema>
文档可能看起来像这样:
<someElement xmlns="http://tempuri.org/OtherSchema" xmlns:m="http://tempuri.org/MySchema"> <someOtherElement someAttribute="value" m:myAttribute="value2" /> </someElement>
此示例的“OtherSchema”如下所示:
<xs:schema id="OtherSchema" targetNamespace="http://tempuri.org/OtherSchema" elementFormDefault="qualified" xmlns="http://tempuri.org/OtherSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:element name="someElement"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="someOtherElement"> <xs:complexType> <xs:attribute name="someAttribute" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
一个完整的示例,包括执行验证的C#控制台应用程序,可以从http://dl.getdropbox.com/u/407740/SchemaTest.zip下载.我的目标是进行此验证而无需修改“OtherSchema”.这可能吗?
我必须添加一个包装器,将两个不同的模式导入一个(因为xmllint只接受一个xml模式):
<xs:schema id="Wrapper" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import schemaLocation="MySchema.xsd" namespace="http://tempuri.org/MySchema"/> <xs:import schemaLocation="OtherSchema.xsd" namespace="http://tempuri.org/OtherSchema"/> </xs:schema>
我可以获得类似问题的唯一方法是编辑OtherSchema,xsd(问题不允许),所以附加一个属性通配符(在现有的之后):
<xs:attribute name="someAttribute" /> <xs:anyAttribute namespace="##other"/>
我不足以成为XML Schema的专家,说“这是不可能的”,但对我来说似乎不可能.
提案的一个问题是您没有指定新属性的显示位置.通常,如果声明属性(或complexElement,modelgroup等),则可以自由引用它.如果您没有明确引用它,它就没有效果.因此,我认为您的提案将被视为已声明但未提及的属性.
您真正想要的是一种说“将此属性添加到每个现有complexType”的方法 – 但您不会这样说.并且,不幸的是,似乎没有办法说出这一点. (甚至没有办法说“将此属性添加到此特定的现有complexType” – 您必须将其包含在原始定义中或根本不包含.)