【问题标题】:XSD 1.1 alternative usage issueXSD 1.1 替代使用问题
【发布时间】:2013-01-30 13:59:11
【问题描述】:

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

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

<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 in Unknown location,第 93 行第 74 列:替代元素的测试属性包含无效内容:{@type='Named'}。

我还尝试过在替代测试条件下使用“@type eq 'Named'”以及大量其他合理和不太合理的变化......没有一个通过:/

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

【问题讨论】:

    标签: xsd xsd-validation xsd-1.1


    【解决方案1】:

    您的 XSD 对我来说似乎很好。我已经在 QTAssistant(最终基于 XSD 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 处理器。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多