complexType set abstract=“true” 的 XSD 问题

XSD problem with complexType set abstract="true"

提问人:Anonyme mein Name geht Dich n 提问时间:10/3/2023 最后编辑:Anonyme mein Name geht Dich n 更新时间:10/4/2023 访问量:66

问:

谢谢!@Yitzhak哈宾斯基,我复制了一个小例子,如下所示:

在定义为吹气的 XSD 文件中:

<?xml version="1.0"?>
<xs:schema
    attributeFormDefault="unqualified"
    elementFormDefault="qualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
    vc:minVersion="1.1"
>   
    <xs:element name="CalculationProcess">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="CalculationStep" type="CalculationStepType" minOccurs="1" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="UniqueId">
            <xs:selector xpath="CalculationStep"/>
            <xs:field xpath="@Id" />
        </xs:unique>
    </xs:element>

    <xs:complexType name="CalculationStepType">
        <xs:sequence>
            <xs:element name="Parameter">
                <xs:complexType>
                    <xs:all>
                        <xs:element name="AdditionalData" type="AddData" minOccurs="0">
                            <xs:alternative test="@Type = 'Woodham'" type="AddDataWoodham"/>
                        </xs:element>
                    </xs:all>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="Id" use="required" inheritable="true">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:minInclusive value="0"></xs:minInclusive>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="Name" type="xs:string" use="required" inheritable="true" />
        <xs:attribute name="Type" type="TCalculationStepType" use="required" />
        <xs:attribute name="InputCount" type="xs:integer" use="required" />
        <xs:attribute name="OutputCount" type="xs:integer" use="required" />
        <!-- StreamId must > 0 -->
        <xs:attribute name="StreamId" use="required" >
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:minInclusive value="1"></xs:minInclusive>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    
    <!-- CalculationStep@Type must match one of the enumerations -->
    <xs:simpleType name="TCalculationStepType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Woodham" />
        </xs:restriction>
    </xs:simpleType>
    
    <xs:complexType name="AddData" abstract="true"/>
       
    <xs:complexType name="AddDataWoodham">
        <xs:complexContent>
            <xs:extension  base="AddData">
                <!--PhotostereoWoodham-->
                <xs:all>
                    <xs:element name="FilePath" type="xs:string" minOccurs="1" />
                    <xs:element name="ScaleFactorP" type="xs:decimal" minOccurs="1" />
                    <xs:element name="ScaleFactorQ" type="xs:decimal" minOccurs="1" />
                    <xs:element name="CalculationMethod" type="xs:integer" minOccurs="1" />
                    <xs:element name="SlantLookupSize" type="xs:integer" minOccurs="1" />
                    <xs:element name="TiltLookupSize" type="xs:integer" minOccurs="1" />
                </xs:all>
            </xs:extension >
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

XML 文件:

<?xml version='1.0'?>
<CalculationProcess xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ObjCalcConfig.xsd">
    <CalculationStep Id='0' Name='Woodham' Type='Woodham' InputCount='4' OutputCount='3' StreamId='1'>
        <Parameter>
            <AdditionalData>
                <FilePath>files\matrix.xml</FilePath>
                <ScaleFactorP>1.5</ScaleFactorP>
                <ScaleFactorQ>1.5</ScaleFactorQ>
                <CalculationMethod>2</CalculationMethod>
                <SlantLookupSize>25</SlantLookupSize>
                <TiltLookupSize>72</TiltLookupSize>
            </AdditionalData>
        </Parameter>
    </CalculationStep>
</CalculationProcess>

但是我收到一个错误:在此处输入图像描述

我不知道问题出在哪里,有人可以帮我解决这个错误吗?谢谢!!!

我试过做abstract=“false”,这不起作用,因为基本元素是空的......

xml xsd 验证 xsd-1.1

评论

0赞 Anonyme mein Name geht Dich n 10/3/2023
来自 XMLSpy 的错误消息:文件 C:\Projekt\Wacker\WackerGrabenerkennung_RT\libAnalyze\xmlvalidation\ObjCalcConfig.xml 无效。元素 <AdditionalData> 的复杂类型定义“AddData”必须具有 abstract='false'。错误位置:CalculationProcess / CalculationStep / Parameter / AdditionalData cvc-type.2:元素 <AdditionalData> 的复杂类型定义“AddData”必须具有 abstract='false'。cvc-elt.5:元素 <AdditionalData> 对于实际类型定义“AddData”无效。
0赞 Yitzhak Khabinsky 10/3/2023
我看到您正在使用“条件类型替代”,但属性无处可寻。@Type
0赞 Yitzhak Khabinsky 10/3/2023
在提出 XSD 问题时,您需要提供一个最小的可重现示例:(1) 格式正确的输入 XML。(2) 你的逻辑,以及尝试实现它的完整 XSD。(3) XSD 处理器及其符合 XSD 标准:1.0 或 1.1。

答:

0赞 Michael Kay 10/4/2023 #1

我不确定你想在这里实现什么。

您的类型替代规则是说,如果是“Woodham”,则元素应具有类型;如果该属性不存在或具有任何其他值(您的示例就是这种情况),则该元素应具有 type ;但是元素不能有类型,因为类型是抽象的。所以这显然是一个错误。@TypeAddDataWoodhamTypeAddDataAddData

您的实例似乎符合类型 ,但未针对该类型进行验证,因为它没有值为 的属性。AddDataWoodhamTypeWoodham

评论

0赞 Anonyme mein Name geht Dich n 10/4/2023
感谢您抽出宝贵时间接受采访!我再次编辑了这个问题并复制了一个小例子,你能帮我再检查一遍吗?
0赞 Michael Kay 10/4/2023
它有完全相同的问题。您的元素没有属性,因此默认类型变为 ,并且它不能采用该类型,因为它是抽象的。TypeAddData
0赞 Anonyme mein Name geht Dich n 10/4/2023
“Type”属性在第 41 行中定义:<xs:attribute name=“Type” type=“TCalculationStepType” use=“required” /> 谢谢!
1赞 Michael Kay 10/4/2023
好的,我看到你已经改变了这个例子。但是属性在错误的元素上:正在查找元素上的属性。Typexs:alternativeTypeAdditionalData
1赞 Michael Kay 10/4/2023
我不得不查一下这个。有一种称为“可继承属性”的机制应该符合要求。github.com/w3c/xsdtests/blob/master/saxonData/CTA/cta0009.xsd 有一个例子,github.com/w3c/xsdtests/blob/master/saxonData/CTA/......