Как я могу использовать тесты подтверждения в Schematron с XPath 1.0? - PullRequest
1 голос
/ 16 марта 2012

Как я могу повторно использовать тест Schematron assert, используя XPath 1.0?В частности, как я могу повторно использовать тест, используя найденное имя атрибута.Если я не могу сделать это, я хотел бы повторно использовать тест и просто иметь один тест для каждого именованного атрибута.(Я думал, что только XPath 2.0 может использовать переменные).Как видно из схемы XSD, у меня тот же тест, но я использую разные имена атрибутов.Примечание: я знаю, что тест для часового пояса не является надежным, это всего лишь пример.

Учитывая XML:

<?xml version="1.0" encoding="utf-8"?>
<MyData versionDate="2010-12-09" dataBeginDate="2012-03-01" dataEndDate="2012-03-10" extractedWhen="2012-03-09T10:08:40">
  <Site Site_key="999">
    <SitePatient Patient_key="1">
      <txt_MyName value="test myname"/>
      <txt_Surname value="test surname" signedWhen="2012-03-08T22:02:39"/>
      <dat_BirthDate value="2010-06-15" signedWhen="2012-03-08T22:02:39"/>
      <sel_Status value="Enrolled" signedWhen="2012-03-08T22:02:39"/>
      <dat_StatusDate value="2012-03-05-05:00" signedWhen="2012-03-08T22:02:39"/>
      <sel_Something value="" valueDate="2012-03-08" signedWhen="2012-03-08T22:02:39"/>
    </SitePatient>
  </Site>
</MyData>

Учитывая XSD:

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

<xs:appinfo>
  <sch:pattern name="Check TimeZone constraints">
  <sch:rule context="*[@signedWhen]">
  <sch:assert test="(substring(@signedWhen, 11, 1) != '-') and (substring(@signedWhen, 11, 1) != '+') and (substring(@signedWhen, 11, 1) != 'Z')">
       <name/> must not include TimeZone information
    </sch:assert>
  </sch:rule>
  </sch:pattern> 
</xs:appinfo> 

<xs:appinfo>
  <sch:pattern name="Check TimeZone constraints">
  <sch:rule context="*[@valueDate]">
    <sch:assert test="(substring(@valueDate, 11, 1) != '-') and (substring(@valueDate, 11, 1) != '+') and (substring(@valueDate, 11, 1) != 'Z')">
       <name/> must not include TimeZone information
    </sch:assert>
  </sch:rule>
  </sch:pattern> 
</xs:appinfo>   

1 Ответ

1 голос
/ 23 марта 2012

Из вашего первого заданного контекста, "* [@ signatureWhen], вы должны иметь доступ к текущему узлу. Вы можете получить другие атрибуты через" ./@value ". Кроме того, вы можете удерживать это значение, используя sch: let как переменная. Вот как вы можете связать оба этих значения данных, хотя я не совсем уверен, был ли это ваш полный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...