XML Schema - 只有一个元素可以具有属性

时间:2016-04-23 15:00:40

标签: xml xsd attributes schematron

我在使用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>

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

2 个答案:

答案 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 &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和您的示例x​​ml here的工作代码。