所有 请建议我如何限制xsd架构:
<root>
<node action="action1" parameter="1" />
</root>
只有在定义属性“action”时才需要属性“parameter”。
谢谢,
答案 0 :(得分:4)
W3C Schema无法表达有条件的必需属性。
Schematron是一个很好的工具,用于验证文档是否符合自定义验证方案,其中有条件地要求内容。
您可以在架构中将这些属性定义为可选,然后使用Schematron根据这些条件规则对其进行验证。
答案 1 :(得分:0)
我创建了这个xsd来尝试解决问题。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchema1"
targetNamespace="http://tempuri.org/XMLSchema1.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchema1.xsd"
xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:group name="populated">
<xs:sequence >
<xs:element name="node">
<xs:complexType>
<xs:attributeGroup ref="actionattrib" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:group>
<xs:group name="unpopulated">
<xs:sequence >
<xs:element name="node">
<xs:complexType>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:group>
<xs:attributeGroup name ="actionattrib">
<xs:attribute name="action1" type="xs:string" />
<xs:attribute name="parameter" type="xs:int" />
</xs:attributeGroup>
<xs:element name="root">
<xs:complexType>
<xs:choice minOccurs ="0">
<xs:group ref="populated" />
<xs:group ref ="unpopulated" />
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
测试方法:
public static void Go()
{
string nameSpace = "http://tempuri.org/XMLSchema1.xsd";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(nameSpace, "XMLSchema1.xsd");
XDocument myDoc1 = new XDocument(
new XElement(XName.Get("root", nameSpace),
new XElement( XName.Get("node", nameSpace ))
)
);
myDoc1.Validate(schemas, (o, e) => { Console.WriteLine(e.Message); });
}
最后在验证时得到了这个例外:
元素'http://tempuri.org/XMLSchema1.xsd:node'的多重定义会导致内容模型变得模糊不清。必须形成内容模型,使得在元素信息项序列的验证期间,可以在不检查内容的情况下唯一地确定直接,间接或隐含地包含在其中依次用于尝试验证序列中的每个项目的粒子。或该项目的属性,并且没有关于序列其余部分中的项目的任何信息。
匹配Mads的结果。他的回答应该被接受。