我在使用XSD架构时遇到了困难。我想设置一个限制,其中节点中只有一个元素可以具有cetrain arttribute并且不会影响另一个元素。
为您提供有效和无效XML文件的示例会更好:
有效的XML
标记someone
必须包含attriubte @id
,但只有其中一个标记可以使@status
属性具有captain
值。
<node>
<someone id="01">Alex</someone>
<someone id="02">Amanda</someone>
<someone id="03" status="captain">Bob</someone>
<someone id="04">Costa</someone>
</node>
无效的XML
以下内容无效。没有办法使用@status
两个。
<node>
<someone id="01" status="captain">Alex</someone>
<someone id="02">Amanda</someone>
<someone id="03" status="captain">Bob</someone>
<someone id="04">Costa</someone>
</node>
也无法跳过@id
。
<node>
<someone status="captain">Alex</someone>
<someone id="01">Amanda</someone>
<someone id="02">Costa</someone>
</node>
我的实际XSD
到目前为止,我有以下xsd
文件,但我不知道如何应用上述限制。
<xsd:complexType name="nodeType">
<xsd:sequence>
<xsd:element name="someone" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="idType" use="required"/>
</xsd:complexType>
我很感谢你的帮助。我认为使用schematron的方式可以更好,更轻松地完成工作,但我对此的体验却很少。
答案 0 :(得分:1)
无法使用XSD 1.0完成。使用断言很容易使用XSD 1.1。我不确定我是否完全理解了这个条件,但这是
<xs:assert test="count(*/@status)=1"/>
答案 1 :(得分:1)
以下是必需的schematron:
<?xml version="1.0" encoding="utf-8"?>
<iso:schema xmlns="http://purl.oclc.org/dsdl/schematron" xmlns:iso="http://purl.oclc.org/dsdl/schematron"
queryBinding='xslt2' schemaVersion='ISO19757-3'>
<iso:pattern id="check">
<iso:rule context="/node/someone">
<iso:assert test= "count(.[@status='captain']) = 1">
You cannont have more than one <someone> with status attribute = captain
</iso:assert>
<iso:assert test= "boolean(@id)">
id is required attribute in <someone>.
</iso:assert>
</iso:rule>
</iso:pattern>
</iso:schema>
您可能需要检查ph-schematron库中的Java以进行测试。
您可以找到使用上述schematron和您的示例xml here的工作代码。