断言的XSD验证规则

时间:2018-01-09 17:54:49

标签: xml validation xpath xsd

我正在使用XSD,我需要使用断言验证相同复杂类型下的2个元素。

OpenDate和CloseDate有两个元素。我正在使用规则

<xs:assert test="if(  
    xs:date(concat(
            substring( OpenDate ,7 ,4 ) ,
            '-',
            substring( OpenDate ,1,2 ),
            '-', 
            substring( OpenDate ,4 ,2 ))  )
    &lt; xs:date(concat(
            substring( ClosedDate,7,4),
            '-',
            substring( ClosedDate,1,2),
            '-',
            substring( ClosedDate,4,2)))) 
    then true() 
    else false()" 
    saxon:message="close date cannot be a date before membership open date"/>

但这会在记录级别生成错误报告。 Xpath显示为Root / Record。此外,它不会显示错误的元素。我需要报告将xpath作为Root / Record / OpenDate和元素名称显示而不仅仅是Record。

另外,你可以建议有没有办法在元素中使用Assertion调用兄弟元素。喜欢

<xs:element name="OpenDate" 
            type="CMGDateFormat" 
            minOccurs="0" 
            maxOccurs="1">
  <xs:annotation>
    <xs:appinfo>
      <format>AAAAAAA</format>
      <originalName><![CDATA[MembershipOpenDate]]></originalName>
      <parent> </parent>
    </xs:appinfo>
  </xs:annotation>
</xs:element>
<xs:element name="MembershipClosedDate" 
            minOccurs="0" 
            maxOccurs="1">
  <xs:annotation>
    <xs:appinfo>
      <format>AAAAAAA</format>
      <originalName><![CDATA[MembershipClosedDate]]></originalName>
      <parent> </parent>
    </xs:appinfo>
  </xs:annotation>
  <xs:simpleType>
    <xs:restriction base="CMGDateFormat">
      <xs:assertion test="
        if(  xs:date(concat(  
               substring( $value,7 ,4 ) ,
               '-',
               substring( $value,1,2 ),
               '-', 
               substring( $value,4 ,2 ))  ) 
             &lt; 
             xs:date(concat(
               substring( Root/Record/Opendate,7,4),
               '-',
               substring( Root/Record/Opendate,1,2),
               '-',
               substring( Root/Record/Opendate,4,2)))) 
        then true() 
        else false()" 
      saxon:message="close date cannot be a date before membership open date"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

有关如何实现上述任何建议。我想使用断言来验证两个不同的元素。

1 个答案:

答案 0 :(得分:0)

XSD 1.1断言被设计为可以在不参考上下文的情况下进行评估:当元素E针对包含断言A的声明D进行验证时,则E(在概念上,至少)被复制到包含E的新文档中否则,然后根据该临时文档的根元素(即E的副本)评估断言A. A包含子表达式并不是错误,子表达式在原始上下文中将引用E之外的元素,但在为评估A而创建的上下文中,这些子表达式将计算为空序列。

请注意,您的示例包含对Root/Record/Opendate的引用,它在任何情况下都不表示兄弟元素。 (你的意思可能是../Opendate。)

如果您的问题是您的错误消息没有提供足够的详细信息,您可能需要研究如何使其更具信息性。