我正在使用XSD,我需要使用断言验证相同复杂类型下的2个元素。
OpenDate和CloseDate有两个元素。我正在使用规则
<xs:assert test="if(
xs:date(concat(
substring( OpenDate ,7 ,4 ) ,
'-',
substring( OpenDate ,1,2 ),
'-',
substring( OpenDate ,4 ,2 )) )
< 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 )) )
<
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>
有关如何实现上述任何建议。我想使用断言来验证两个不同的元素。
答案 0 :(得分:0)
XSD 1.1断言被设计为可以在不参考上下文的情况下进行评估:当元素E针对包含断言A的声明D进行验证时,则E(在概念上,至少)被复制到包含E的新文档中否则,然后根据该临时文档的根元素(即E的副本)评估断言A. A包含子表达式并不是错误,子表达式在原始上下文中将引用E之外的元素,但在为评估A而创建的上下文中,这些子表达式将计算为空序列。
请注意,您的示例包含对Root/Record/Opendate
的引用,它在任何情况下都不表示兄弟元素。 (你的意思可能是../Opendate
。)
如果您的问题是您的错误消息没有提供足够的详细信息,您可能需要研究如何使其更具信息性。