2011-04-29 3 views
2

Schematron XML 날짜 비교가 작동하지 않습니다. 그리고 그것은 잘못된 오류를 반환합니다. 나는 schematron 1.01을 사용하고 있다고 생각한다. 나는 MSDN에서 C# 및 DLL을 사용하고 있습니다 :XML과 Schematron을 사용하여 날짜를 비교하는 방법

From pattern "Check co-occurrence constraints" 
    Assert fails: VisitDate must be within a valid date range as specified in dataBeginDate and dataEndDate 
    At: /MyData[1]/Site[1]/Patient[1]/form_Baseline[1]/dat_VisitDate[1] 
     <dat_VisitDate signedWho="System" value="2009-02-02">...</dat_VisitDate> 
     (Line: 7, Column: 10) 

스키마 트론 규칙 :

<sch:rule context="MyData/Site/Patient/form_Baseline/dat_VisitDate"> 
    <sch:assert test="@value > //MyData/@dataBeginDate">VisitDate must be within a valid date range as specified in dataBeginDate and dataEndDate</sch:assert> 
</sch:rule> 

여기 MSDN schematron link

가 (방법이 XSD 유효성 검사를 통과하여) 오류 출력 XML :

<?xml version="1.0" encoding="utf-8"?> 
<MyData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" dataBeginDate="2008-01-01" dataEndDate="2011-04-26"> 
    <Site SiteKey="11"> 
    <Patient PatientKey="33"> 
     <dat_StatusDate signedWho="System" value="2009-01-01" /> 
     <form_Baseline> 
     <dat_VisitDate signedWho="System" value="2009-02-02" /> 
     </form_Baseline> 
     <form_Flowsheet VisitDateKey="2009-03-03"> 
     <dat_OtherDate signedWho="System" value="2009-03-03" /> 
     </form_Flowsheet> 
    </Patient> 
    </Site> 
</MyData> 

XSD :

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:sch="http://www.ascc.net/xml/schematron"> 

    <xs:annotation> 
    <xs:appinfo> 
     <sch:title>Schematron Validation</sch:title> 
    </xs:appinfo> 
    </xs:annotation> 

    <xs:simpleType name="dateMyDate"> 
    <xs:restriction base="xs:date"> 
     <xs:minInclusive value="2000-01-01"/> 
    </xs:restriction> 
    </xs:simpleType>  
    <xs:simpleType name="integerMyKey"> 
    <xs:restriction base="xs:integer"> 
     <xs:minInclusive value="1"/> 
     <xs:maxInclusive value="9999"/> 
    </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="stringNonEmpty"> 
    <xs:restriction base="xs:string"> 
     <xs:minLength value="1"/> 
     <xs:maxLength value="32"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:element name="MyData"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Site" minOccurs="1" maxOccurs="1"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Patient" minOccurs="0" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 

        <xs:element name="dat_StatusDate" minOccurs="1" maxOccurs="1"> 
         <xs:complexType> 
         <xs:attribute name="value" type="dateMyDate" use="required" /> 
         <xs:attribute name="signedWho" type="stringNonEmpty" use="required" /> 
         </xs:complexType> 
        </xs:element> 
        <xs:element name="form_Baseline" minOccurs="0" maxOccurs="1"> 
         <xs:complexType> 
         <xs:sequence> 
          <xs:element name="dat_VisitDate" minOccurs="1" maxOccurs="1"> 
          <xs:complexType> 


       <xs:annotation> 
       <xs:appinfo> 
        <sch:pattern name="Check co-occurrence constraints"> 
        <sch:rule context="MyData/Site/Patient/form_Baseline/dat_VisitDate"> 
        <sch:assert test="@value > //MyData/@dataBeginDate"> 
         VisitDate must be within a valid date range as specified in dataBeginDate and dataEndDate 
        </sch:assert> 
        </sch:rule> 
        </sch:pattern> 
       </xs:appinfo> 
       </xs:annotation>         


           <xs:attribute name="value" type="dateMyDate" use="required" /> 
           <xs:attribute name="signedWho" type="stringNonEmpty" use="required" /> 
          </xs:complexType> 
          </xs:element> 

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

        <xs:element name="form_Flowsheet" minOccurs="0" maxOccurs="unbounded"> 
         <xs:complexType> 
         <xs:sequence> 
          <xs:element name="dat_OtherDate" minOccurs="1" maxOccurs="1"> 
          <xs:complexType> 
           <xs:attribute name="value" type="dateMyDate" use="required" /> 
           <xs:attribute name="signedWho" type="stringNonEmpty" use="required" /> 
          </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
         <xs:attribute name="VisitDateKey" type="dateMyDate" use="required" /> 
         </xs:complexType> 
        </xs:element> 

        </xs:sequence> 
        <xs:attribute name="PatientKey" type="stringNonEmpty" use="required" /> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute name="SiteKey" type="integerMyKey" use="required" /> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
     <xs:attribute name="dataBeginDate" type="dateMyDate" use="required" /> 
     <xs:attribute name="dataEndDate" type="dateMyDate" use="required" /> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

답변

1

찾을 답 : 1.0은 비교 연산자를 숫자 <>를 사용

의 XPath. 따라서 날짜를 숫자 값으로 변환해야합니다.

<sch:assert test="translate(@value, '-', '') > translate(//MyData/@dataBeginDate, '-', '')"> 

이상 명시 적으로 :

<sch:assert test="number(translate(@value, '-', '')) > number(translate(//MyData/@dataBeginDate, '-', ''))"> 
+1

당신이 스키마 트론의 XSLT 2.0 구현은 당신이 XSD'로 날짜를 비교할 수 실행 한 경우 : date' 및 표준'lt','le','있다을 사용 ','ge'은 날짜 객체를 수치로 평평하게하지 않고 비교합니다. –

관련 문제