了解 schematron 验证
Understanding schematron validation
我是 xml 的新手,我很难理解以下语句中发生的事情。 Schematron 文件来自 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>
谢谢
给定目标节点:
<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']
的值,因为这是一个断言,如果比较的值不匹配或 iwxxm:weather
不匹配,它 returns 为真有一个属性 @nilReason
.
如果iwxxm:weather/@xlink:href
和document('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf')/rdf:RDF/*/skos:member/*/@*[local-name()='about']
是相等的匹配或者iwxxm:weather
应该有一个属性@nilReason
.
,它会通过
Schematron 断言正在验证是否满足以下两个条件之一:
iwxxm:weather
上下文元素的 xlink:href
属性值等于来自特定 RDF 文档的 about
属性的值:
document()
函数用于访问外部XML文档。在本例中,它是 codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf
RDF 文档。
- 然后它将 XPath 应用到 select 本地名称为
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>
- 或
iwxxm:weather
上下文元素具有 nilReason
属性
例如,如果元素看起来像这样:
<iwxxm:weather nilReason="true" />
我是 xml 的新手,我很难理解以下语句中发生的事情。 Schematron 文件来自 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>
谢谢
给定目标节点:
<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']
的值,因为这是一个断言,如果比较的值不匹配或 iwxxm:weather
不匹配,它 returns 为真有一个属性 @nilReason
.
如果iwxxm:weather/@xlink:href
和document('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf')/rdf:RDF/*/skos:member/*/@*[local-name()='about']
是相等的匹配或者iwxxm:weather
应该有一个属性@nilReason
.
Schematron 断言正在验证是否满足以下两个条件之一:
iwxxm:weather
上下文元素的xlink:href
属性值等于来自特定 RDF 文档的about
属性的值:document()
函数用于访问外部XML文档。在本例中,它是codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf
RDF 文档。- 然后它将 XPath 应用到 select 本地名称为
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>
- 或
iwxxm:weather
上下文元素具有nilReason
属性
例如,如果元素看起来像这样:
<iwxxm:weather nilReason="true" />