断言无效,错位或过于频繁发生

时间:2013-02-04 16:17:45

标签: xml testing xsd assert

我正在尝试生成我的XSD时遇到这个错误,无法弄清楚我做错了什么;我的代码看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="FICH">
<xs:complexType>

<xs:sequence>
<xs:element name="cabeza">
<xs:complexType>
<xs:sequence>
<xs:element name="VERSION_ORIG" type="Version"/>

</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name="DATA_MAJ">
<xs:complexType>
<xs:sequence>
<xs:element name="DATA1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>

<xs:element name="VERSION_SIT_NOM" type="Version"/>

</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>

<xs:assert test="CABEZA/VERSION_ORIG = DATA_MAJ/VERSION_SIT_NOM"/>

</xs:complexType>
</xs:element>
<xs:simpleType name="YYMM">
<xs:restriction base="xs:integer">
<xs:pattern value="[0-9]{2}[01|02|03|04|05|06|07|08|09|10|11|12]"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Version">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{2}.[0-9]{2}.[0-9]{2}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="emptyString">
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
</xs:schema>

这个想法是元素CABEZA / VERSION_ORIG必须等于DATA_MAJ / VERSION_SIT_NOM。我已经找到了一些解决方案,但一切似乎都适合我。

提前致谢

2 个答案:

答案 0 :(得分:0)

您的架构文档对我来说看起来不错(更重要的是,对Saxon 9也是如此)。

因此,您错误消息的最可能原因是(1)您使用的是XSD 1.0处理器来处理XSD 1.1架构文档,以及(2)您的处理器在这种情况下不提供世界上最好的错误消息。此时(2013年初)XSD 1.1由Saxon和Xerces J的测试版支持。如果您正在使用其他XSD验证器,您可能需要联系供应商或开发人员询问他们何时支持XSD 1.1。 (如果他们认为用户不关心,没有人会转向1.1。)

答案 1 :(得分:0)

你做错了几件事。让我们从更正的XSD和匹配的样本XML开始。

<强> XSD:

<?xml version="1.0" encoding="UTF-8"?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" xmlns:tns="http://www.w3schools.com" elementFormDefault="qualified">
    <xs:element name="FICH">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="cabeza">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="VERSION_ORIG" type="Version"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="DATA_MAJ">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="DATA1" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="VERSION_SIT_NOM" type="Version"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>          
            <xs:assert test="tns:cabeza/tns:VERSION_ORIG = tns:DATA_MAJ/tns:DATA1/tns:VERSION_SIT_NOM"/>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="YYMM">
        <xs:restriction base="xs:integer">
            <xs:pattern value="[0-9]{2}[01|02|03|04|05|06|07|08|09|10|11|12]"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="Version">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9]{2}.[0-9]{2}.[0-9]{2}"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="emptyString">
        <xs:restriction base="xs:string">
            <xs:enumeration value=""/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

无效的XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<FICH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.w3schools.com">
    <cabeza>
        <VERSION_ORIG>22.22.22</VERSION_ORIG>
    </cabeza>
    <DATA_MAJ>
        <DATA1>
            <VERSION_SIT_NOM>22.22.23</VERSION_SIT_NOM>
        </DATA1>
    </DATA_MAJ>
</FICH>

错误讯息:

Error while loading [], line 12 position 8
cvc-assertion.3.13.4.1: Assertion evaluation ('tns:cabeza/tns:VERSION_ORIG = tns:DATA_MAJ/tns:DATA1/tns:VERSION_SIT_NOM') for element 'FICH' with type '#anonymous' did not succeed. 
Document1.xml is XSD 1.1 invalid.

说明:

  • 您很可能正在使用XSD 1.0处理器来验证XSD 1.1。注释断言并查看错误是否消失。
  • 除非您的XSD没有目标命名空间,否则您必须在上面的示例XSD中提供别名,例如xmlns:tns,以匹配您的目标命名空间;确保XPath适当地使用前缀。有原因,而且Xerces(正如@CMSperbergMcQueen所提到的)似乎也非常想要它们。
  • 你的XPath都错了。名称区分大小写,所以cabeza不是CABEZA,而且你的XSD中还有一个与你的XPath不匹配的额外级别;更具体地说,你错过了一个DATA1。