【问题标题】:XML Schema - Only one of elements can have an attributeXML Schema - 只有一个元素可以有一个属性
【发布时间】:2016-04-23 15:00:40
【问题描述】:

我对 XSD 架构感到困惑。我想设置一个限制,即节点中只有一个元素可以具有 cetrain 属性并且不影响另一个元素。

给你一个有效和无效的 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 xml xsd attributes schematron


    【解决方案1】:

    XSD 1.0 无法做到这一点。在 XSD 1.1 中使用断言很容易做到。不确定我是否完全理解这种情况,但确实是这样

    <xs:assert test="count(*/@status)=1"/>
    

    【讨论】:

    • 谢谢,这就是我一直在寻找的。只是好奇:有没有办法对 Schematron 做同样的事情?
    • 是的,schematron 具有相同的表达能力。不过好久没用了,语法记不住了。
    • 谢谢你的帮助:))
    • 请看我的回复,其中提到使用 schematron 验证 xml
    • @MichaelKay 你能帮我找出支持 XSD 1.1 处理的 java 库吗?我尝试了很多很多,最终选择了schematron
    【解决方案2】:

    下面是所需的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 的工作代码。

    【讨论】:

    • 非常感谢,我现在明白它的逻辑了:)
    猜你喜欢
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2013-05-31
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多