我需要根据属性值为单一类型的节点进行特定的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问题),我得到以下错误:
错误XSDEError位于未知位置,第93行,第74列:替换元素的测试属性包含无效内容:{@type='Named'}。
我还在备选测试条件中尝试了"@type eq'Named'",以及大量其他合理和不太合理的变体。。。无通过:/
任何帮助都将不胜感激!谢谢
与Petru-Gardea一样,我相信您的XSD模式很好(更重要的是,Saxon也是如此)。
问题是您的XSD处理器不支持XSD 1.1;QXmlSchema类引用说"这个类用于表示符合XML Schema 1.0规范的模式。"错误消息可能会更清楚一点(通过抱怨@type而不是xsd:alternative,它确实给出了错误的想法),但错误消息通常也是如此,毕竟它通常会报告软件不准备处理的情况。
您的XSD对我来说似乎很好。我在QTAssistant中尝试过它(它最终基于XSD1.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处理器。