2016-10-11 6 views
0
<ROOTNODE> 
    <Blocks> 
    <Block> 
    <Ref/> 
     <BlockDates Start="2015-10-20" End="2015-10-20" /> 
     <Types> 
     <Type TypeCode="SGL" /> 
     </Types> 
    </Block> 

    <Block> 
     <Ref/> 
     <BlockDates Start="2015-10-19" End="2015-10-18"/> 
     <Types> 
     <Type TypeCode="SGL" /> 
     </Types> 
    </Block> 
    </Blocks> 
    </ROOTNODE> 

Мне нужно сообщить об ошибке, если дата @Start меньше предыдущей даты @End. Но только если @TypeCode совпадает с предыдущим @TypeCode. Вышеизложенное должно генерировать ошибку. Ниже я попытался. Любая помощь приветствуется!SchemaTron проверяет предыдущие атрибуты

<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron"> 
       <sch:pattern> 
        <sch:rule context="BlockDates|Type"> 
          <sch:report test="translate(@Start, '-', '') &lt;= translate(preceding::*/@End, '-', '') and @TypeCode = preceding::*/@TypeCode"> Error start date is before end date and type codes match.  </sch:report>                
    </sch:rule>         </sch:pattern>                
    </sch:schema> 
+0

Мартин, это работает отлично. -Спасибо! – user1128792

ответ

1

Я хотел бы использовать Block элемент в качестве контекста:

<sch:pattern> 
    <sch:rule context="Block[Types/Type/@TypeCode = preceding-sibling::Block[1]/Types/Type/@TypeCode]"> 
     <sch:assert test="translate(BlockDates/@Start, '-', '') &lt; translate(preceding-sibling::Block[1]/@End, '-', '')"></sch:assert> 
    </sch:rule> 
</sch:pattern>