XSD 1.1替代使用问题

时间:2013-02-14 17:16:40

标签: xsd xsd-validation xsd-1.1

我需要根据属性值对单一类型的节点进行特定的XSD验证:XSD 1.1和xsd:替代应该是我的朋友。

但是以下(最简单)示例:

<xsd:complexType name="BaseType">
    <xsd:attribute name="type" 
                   type="xsd:string" 
                   use="required" />
</xsd:complexType>  

<xsd:complexType name="NamedType">
    <xsd:complexContent>
        <xsd:extension base="BaseType">
            <xsd:attribute name="path" 
                           type="xsd:string" 
                           use="required" />
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>  

<xsd:complexType name="TaggedType">
    <xsd:complexContent>
        <xsd:extension base="BaseType">
            <xsd:attribute name="tag" 
                           type="xsd:string" 
                           use="required" />
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>  

<xsd:element name="MyRoot">
    <xsd:complexType>
          <xsd:choice minOccurs="1">
            <xsd:element name="MyType" 
                         type="BaseType">
              <xsd:alternative test="@type='Named'" 
                               type="NamedType"/>
              <xsd:alternative test="@type='Tagged'" 
                               type="TaggedType"/>
            </xsd:element>
          </xsd:choice>
    </xsd:complexType>
</xsd:element>

当我加载XSD时(使用Qt 4.7.4中的QXmlSchema类但我认为这是一个XSD问题而不是Qt问题)我收到以下错误:

错误XSDError在未知位置,第93行,第74列:替代元素的测试属性包含无效内容:{@ type ='Named'}。

在替代测试条件下,我也试过“@type eq'命名'”,还有其他一些明智且不太明智的变化...没有通过:/

任何帮助将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:1)

你的XSD对我来说很好。我在QTAssistant中尝试过它(最终基于Xer 1.1的Xerces版本),它运行得很好。

使用此示例XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
    <MyType type="Tagged"/> 
</MyRoot>

我明白了:

Error while loading [], line 4 position 25
cvc-complex-type.4: Attribute 'tag' must appear on element 'MyType'.
Document1.xml is XSD 1.1 invalid.

使用此XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
    <MyType type="Named"/>  
</MyRoot>

我明白了:

Error while loading [], line 4 position 24
cvc-complex-type.4: Attribute 'path' must appear on element 'MyType'.
Document1.xml is XSD 1.1 invalid.

按照建议修复上述内容将产生有效的XML结果。你的语法是正确的,所以我只能怪你的XSD处理器。

答案 1 :(得分:1)

与Petru Gardea一样,我相信你的XSD架构很好(而且更重要的是,Saxon也是如此)。

问题是您的XSD处理器不支持XSD 1.1; QXmlSchema Class Reference表示“此类用于表示符合XML Schema 1.0规范的模式。”错误消息可能会更清楚一点(通过抱怨@type而不是xsd:替代它确实给出了错误的想法),但这通常是错误消息的真实情况,这通常是报告软件不准备处理的情况。