XML 架构 - 只有一个元素可以具有属性
XML Schema - Only one of elements can have an attribute
我对 XSD 架构感到困惑。我想限制一个节点中只有一个元素可以具有 cetrain arttribute 并且不影响另一个元素。
给你一个有效和无效XML文件的例子会更好:
有效XML
标签 someone
必须包含属性 @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 的方式可以更好更轻松地完成工作,但是我对此的经验真的很少。
无法使用 XSD 1.0 完成。 XSD 1.1 使用断言很容易做到。不确定我是否完全理解这种情况,但确实如此
<xs:assert test="count(*/@status)=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.
我对 XSD 架构感到困惑。我想限制一个节点中只有一个元素可以具有 cetrain arttribute 并且不影响另一个元素。
给你一个有效和无效XML文件的例子会更好:
有效XML
标签 someone
必须包含属性 @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 的方式可以更好更轻松地完成工作,但是我对此的经验真的很少。
无法使用 XSD 1.0 完成。 XSD 1.1 使用断言很容易做到。不确定我是否完全理解这种情况,但确实如此
<xs:assert test="count(*/@status)=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.