Fil*_*ącz 14 xml schema xsd xml-attribute
我正在尝试使两个XML属性互斥.如何创建XSD架构来捕获这种场景?
我想要其中一个
<elem value="1" />
<elem ref="something else" />
Run Code Online (Sandbox Code Playgroud)
但不是
<elem value="1" ref="something else" />
Run Code Online (Sandbox Code Playgroud)
你不能使用属性,但你可以使用子元素......
<element name="elem">
<complexType>
<choice>
<element name="value"/>
<element name="ref"/>
</choice>
</complexType>
</element>
Run Code Online (Sandbox Code Playgroud)
这样你就可以......
<elem>
<value>1</value>
</elem>
Run Code Online (Sandbox Code Playgroud)
要么...
<elem>
<rel>something else</rel>
</elem>
Run Code Online (Sandbox Code Playgroud)
不幸的是AFAIK你不能用XML Schema做到这一点,我自己也有同样的问题.
我已经看到它建议如果你需要两个:
<elem type="xxx">
<elem ref="yyy">
Run Code Online (Sandbox Code Playgroud)
然后<elem>它本身应该分为两种类型,因为它们显然有不同的属性......
由于 在Alnitak的答案中提到了RelaxNG,因此这里是RelaxNG(一种语言,在大多数情况下,比W3C Schema更好)的解决方案.请注意elem定义中的OR(|):
start = document
document = element document {elem+}
elem = element elem {ref | value}
ref = attribute ref {text}
value = attribute value {xsd:integer}
Run Code Online (Sandbox Code Playgroud)
如果我有这个XML文件:
<document>
<elem value="1" />
<elem ref="something else" />
</document>
Run Code Online (Sandbox Code Playgroud)
% rnv attributes-exclusive.rnc attributes-exclusive.xml
attributes-exclusive.xml
% xmllint --noout --relaxng attributes-exclusive.rng attributes-exclusive.xml
attributes-exclusive.xml validates
Run Code Online (Sandbox Code Playgroud)
如果我添加XML文件:
<elem value="1" ref="something else" />
Run Code Online (Sandbox Code Playgroud)
我得到验证错误,因为我想要(请注意错误消息不是最理想的):
% rnv attributes-exclusive.rnc attributes-exclusive.xml
attributes-exclusive.xml
attributes-exclusive.xml:4:0: error: attribute ^ref not allowed
required:
after
% xmllint --noout --relaxng attributes-exclusive.rng attributes-exclusive.xml
attributes-exclusive.xml:4: element elem: Relax-NG validity error : Invalid attribute value for element elem
attributes-exclusive.xml fails to validate
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10709 次 |
| 最近记录: |