错误:元素“断言”无效,放错位置或经常发生

时间:2018-08-01 19:01:25

标签: xml xsd xml-parsing xsd-validation xsd-1.1

我尝试在XSD中断言,但出现错误

  

元素“断言”无效,放错位置或经常发生。

我的示例是下面的XML。

`<?xml version="1.0" encoding="utf-8"?>
<p:CustomerElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <recordCount>1234</recordCount>
  <Customer>
      <indicator>A</indicator>
      <test1>hdjfs</test1>
      <test2>idsfh</test2>
	  <test3>idsfh</test3>
	  <test4>idsfh</test4>
	  <test5>idsfh</test5>
	  <test6>idsfh</test6>
	  <test7>idsfh</test7>
	</Customer>
    <Customer>
      <indicator>D</indicator>
      <test1>abcd</test1>
	  <test3>jhf</test3>
    </Customer>
</p:CustomerElement>`

为此创建的XSD是

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns="http://My.Schema.Namespace" 
           targetNamespace="http://My.Schema.Namespace"
		   xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           elementFormDefault="qualified"
           vc:minVersion="1.1">>

  <xs:element name="customer">
    <xs:complexType>
	<xs:sequence>
      <xs:element name="indicator">
	<xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="A" />
            <xs:enumeration value="B" />
          </xs:restriction>
    </xs:simpleType>
	  </xs:element>
      <xs:choice>
        <xs:element name="test1" />
        <xs:element name="test2" />
		<xs:element name="test3" />
		<xs:element name="test4" />
		<xs:element name="test5" />
		<xs:element name="test6" />
		<xs:element name="test7" />
      </xs:choice>
	  </xs:sequence>
    <xs:assert test="if(indicator eq 'A') then test1 and test2 and test3 and test4 
						and test5 and test6 and test7
						else if(indicator eq 'B') then test1 and test3"/>
	</xs:complexType>
  </xs:element>
 </xs:schema>

我正在freeformat validator中用XSD验证以上xml。

我猜断言的语法中几乎没有错误。任何人都可以在我正在寻找的条件下提供帮助,并在语法上帮助我,并且也让我知道是否添加了支持XSD 1.1架构的正确链接。

1 个答案:

答案 0 :(得分:1)

要解决XSD的问题,请执行以下操作:

  1. 更改

       elementFormDefault="qualified"
       vc:minVersion="1.1">>
    

       vc:minVersion="1.1">
    

    消除虚假的>和重复的elementFormDefault属性。

  2. 在断言测试中添加else false(),以便其格式正确。更好的是,无需复合if-else构造即可重新写入逻辑等效项。

  3. 如果要使用xs:assert,请使用XSD 1.1 处理器。 Freeformat.com仅支持XSD 1.0

格式良好的XSD

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns="http://My.Schema.Namespace" 
  targetNamespace="http://My.Schema.Namespace"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  vc:minVersion="1.1">

  <xs:element name="customer">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="indicator">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="A" />
              <xs:enumeration value="B" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:choice>
          <xs:element name="test1" />
          <xs:element name="test2" />
          <xs:element name="test3" />
          <xs:element name="test4" />
          <xs:element name="test5" />
          <xs:element name="test6" />
          <xs:element name="test7" />
        </xs:choice>
      </xs:sequence>
      <xs:assert test="if (indicator eq 'A') 
        then test1 and test2 and test3 and test4 and test5 and test6 and test7
        else if (indicator eq 'B') then test1 and test3 else false()"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

假设可以克服上述障碍,则要让XML针对此XSD保持有效性,这是发问者要完成的一项练习。