1

我需要根据属性值对单一类型的节点进行特定的 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,第 93 行第 74 列:替代元素的测试属性包含无效内容:{@type='Named'}。

我也在替代测试条件下尝试了“@type eq 'Named'”以及大量其他明智和不太明智的变化......没有通过:/

任何帮助都感激不尽!谢谢!

4

2 回答 2

1

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

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

于 2013-02-14T20:05:24.177 回答
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 处理器。

于 2013-02-14T18:25:50.187 回答