Понимание проверки схемы

Я новичок в xml, и мне трудно понять, что происходит в приведенном ниже заявлении. Файл схемы находится по адресу https://schemas.wmo.int/iwxxm/3.0.0/rule/iwxxm.sch

<sch:rule context="//*[contains(name(),'MeteorologicalAerodromeTrendForecast')]/iwxxm:weather">
<sch:assert test="@xlink:href = document('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf')/rdf:RDF/*/skos:member/*/@*[local-name()='about'] or @nilReason">
MeteorologicalAerodromeTrendForecast iwxxm:weather elements should be a member of http://codes.wmo.int/49-2/AerodromePresentOrForecastWeather
</sch:assert>
</sch:rule>

Я понимаю, что есть правило проверки элемента iwxxm:weather, но я не могу понять условие проверки. Может ли кто-нибудь объяснить это мне, пожалуйста? При каком значении тест пройдет.

Тест не работает в строке в xml, которая

<iwxxm:MeteorologicalAerodromeForecast gml:id="uuid.c42e9861-aed6-449f-b4cd-4789e96464d5" cloudAndVisibilityOK="false">
          <iwxxm:prevailingVisibility uom="m">350</iwxxm:prevailingVisibility>
          <iwxxm:surfaceWind>
            <iwxxm:AerodromeSurfaceWindForecast variableWindDirection="false">
              <iwxxm:meanWindDirection uom="deg">240</iwxxm:meanWindDirection>
              <iwxxm:meanWindSpeed uom="[kn_i]">8</iwxxm:meanWindSpeed>
            </iwxxm:AerodromeSurfaceWindForecast>
          </iwxxm:surfaceWind>
 Here ---->         <iwxxm:weather xlink:href="http://codes.wmo.int/49-2/AerodromePresentOrForecastWeather/_RA"/> 
          <iwxxm:cloud>

Спасибо


person NJMR    schedule 19.02.2020    source источник
comment
изменить contains(name(),'MeteorologicalAerodromeTrendForecast') на contains(local-name(),'MeteorologicalAerodromeTrendForecast').   -  person Joel M. Lamsen    schedule 26.02.2020
comment
Файл Schematron взят из schemas.wmo.int/iwxxm/3.0.0. /rule/iwxxm.sch, и я не могу изменить файл. Я проверяю свой файл по этому файлу схемы и получаю эти ошибки.   -  person NJMR    schedule 26.02.2020


Ответы (2)


Утверждение Schematron проверяет выполнение одного из следующих двух условий:

  1. значение атрибута xlink:href элемента контекста iwxxm:weather равно значению атрибута about из конкретного RDF-документа:

    • The document() function is used to access an external XML document. In this case, it is the codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf RDF document.
    • Затем он применяет XPath для выбора атрибута с локальным именем about (не имеет значения, привязан он к пространству имен или нет)
    • который прикреплен к элементу (не имеет значения, как называется элемент)
    • это дочерний элемент элемента skos:member
    • это дочерний элемент элемента (не имеет значения, как называется элемент)
    • это дочерний элемент документа rdf:RDF.

Например, если документ RDF выглядел так:

  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
           xmlns:skos="http://www.w3.org/2004/02/skos/core#">
  <foo>
    <skos:member>
      <bar skos:about="http://codes.wmo.int/49-2/AerodromePresentOrForecastWeather/_RA"/>
    </skos:member>
  </foo>
</rdf:RDF>
  1. или элемент контекста iwxxm:weather имеет атрибут nilReason

Например, если бы элемент выглядел так:

<iwxxm:weather nilReason="true" /> 
person Mads Hansen    schedule 03.03.2020

учитывая целевой узел:

<iwxxm:weather xlink:href="http://codes.wmo.int/49-2/AerodromePresentOrForecastWeather/_RA"/>

и тест утверждения:

@xlink:href = document('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf')/rdf:RDF/*/skos:member/*/@*[local-name()='about'] or @nilReason

он сравнивает значения iwxxm:weather/@xlink:href и document('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf')/rdf:RDF/*/skos:member/*/@*[local-name()='about'], поскольку это утверждение, он возвращает true, если сравниваемые значения не совпадают ИЛИ iwxxm:weather не имеет атрибута @nilReason.

Он пройдет, если iwxxm:weather/@xlink:href и document('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf')/rdf:RDF/*/skos:member/*/@*[local-name()='about'] совпадают или iwxxm:weather должен иметь атрибут @nilReason.

person Joel M. Lamsen    schedule 26.02.2020
comment
не могли бы вы объяснить выражение xpath document('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf')/rdf:RDF/*/skos:member/*/@*[local-name()='about' ] - person NJMR; 26.02.2020
comment
document('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf') получает ресурс, затем просматривает содержимое до /rdf:RDF/*/skos:member/*/@*[local-name()='about'] - person Joel M. Lamsen; 26.02.2020