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>

感谢您的帮助。我认为使用 的方式可以更好更轻松地完成工作,但是我对此的经验真的很少。

无法使用 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 &lt;someone&gt; with status attribute = captain
            </iso:assert>
            <iso:assert test= "boolean(@id)">
                id is required attribute in &lt;someone&gt;.
            </iso:assert>
        </iso:rule>
    </iso:pattern>
</iso:schema>

您可能需要查看 ph-schematron 库以测试 Java。

您可以找到使用上述 schematron 和您的示例的工作代码 xml here.