XSD和元素存在性要求,或其他选项

XSD和元素存在性要求,或其他选项,xsd,xml-validation,Xsd,Xml Validation,在XSD级别,我可以基于文档中另一个元素的存在来定义元素需求吗 例如,我想要求在元素同时存在时提供元素,否则名字是可选的 如果这不能在XSD级别强制执行,那么我是否应该使这两个元素都是可选的,并通过不同级别的检查来强制执行需求 欢迎选择 这不能在XSD级别强制执行 让这两个元素都成为可选的,并在应用程序体系结构的不同级别强制执行需求,这对我来说是一个不错的选择。下面是一个在DTD中实现的示例。(注意:测试实例是使用oxygenxml编辑器(使用Xerces)验证的。) DTD(test.DTD)

在XSD级别,我可以基于文档中另一个元素的存在来定义元素需求吗

例如,我想要求在
元素同时存在时提供元素
,否则名字是可选的

如果这不能在XSD级别强制执行,那么我是否应该使这两个元素都是可选的,并通过不同级别的检查来强制执行需求


欢迎选择

这不能在XSD级别强制执行


让这两个元素都成为可选的,并在应用程序体系结构的不同级别强制执行需求,这对我来说是一个不错的选择。

下面是一个在DTD中实现的示例。(注意:测试实例是使用oxygenxml编辑器(使用Xerces)验证的。)

DTD(test.DTD)


以下是一些示例XML实例(有效和无效):

有效

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT user ((firstname?|(firstname,id)),lastname)>
<!ELEMENT firstname (#PCDATA)>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT id (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "test.dtd">
<user>
  <firstname/>
  <id/>
  <lastname/>
</user>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "test.dtd">
<user>
  <id/>
  <lastname/>
</user>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "test.dtd">
<user>
  <firstname/>
  <lastname/>
</user>

无效

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT user ((firstname?|(firstname,id)),lastname)>
<!ELEMENT firstname (#PCDATA)>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT id (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "test.dtd">
<user>
  <firstname/>
  <id/>
  <lastname/>
</user>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "test.dtd">
<user>
  <id/>
  <lastname/>
</user>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "test.dtd">
<user>
  <firstname/>
  <lastname/>
</user>

有效

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT user ((firstname?|(firstname,id)),lastname)>
<!ELEMENT firstname (#PCDATA)>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT id (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "test.dtd">
<user>
  <firstname/>
  <id/>
  <lastname/>
</user>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "test.dtd">
<user>
  <id/>
  <lastname/>
</user>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "test.dtd">
<user>
  <firstname/>
  <lastname/>
</user>


我不认为这可以用XSD实现(就像pmartin说的那样),但可以用DTD实现。如果您感兴趣,请告诉我,我将发布一个示例。@DevNull:当然,请继续发布一个DTD示例,因为我的问题标题要求提供选项,此类信息对未来的访问者很有用。我用“欢迎选项”修改了问题文本,以加强标题。谢谢