【问题标题】:Understanding schematron validation了解 schematron 验证
【发布时间】:2020-06-03 08:06:15
【问题描述】:

我是 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>

谢谢

【问题讨论】:

  • contains(name(),'MeteorologicalAerodromeTrendForecast') 更改为contains(local-name(),'MeteorologicalAerodromeTrendForecast')
  • Schematron 文件来自schemas.wmo.int/iwxxm/3.0.0/rule/iwxxm.sch,我无法更改该文件。我正在根据这个 schematron 文件验证我的文件并收到这些错误。

标签: xml xslt xsd schema schematron


【解决方案1】:

Schematron 断言正在验证是否满足以下两个条件之一:

  1. iwxxm:weather 上下文元素的 xlink:href 属性值等于特定 RDF 文档中 about 属性的值:

    • document() 函数用于访问外部 XML 文档。在本例中,它是codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf RDF 文档。
    • 然后它应用 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" /> 

【讨论】:

    【解决方案2】:

    给定目标节点:

    <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:hrefdocument('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf')/rdf:RDF/*/skos:member/*/@*[local-name()='about']的值,因为这是一个断言,如果比较的值不匹配或者iwxxm:weather没有属性@nilReason,它返回true。

    如果iwxxm:weather/@xlink:hrefdocument('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf')/rdf:RDF/*/skos:member/*/@*[local-name()='about'] 相等匹配或iwxxm:weather 应该具有@nilReason 属性,它将通过。

    【讨论】:

    • 能否请您解释一下xpath表达式文档('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf')/rdf:RDF/*/skos:member/*/@*[local -name()='关于']
    • document('codes.wmo.int-49-2-AerodromePresentOrForecastWeather.rdf') 获取资源,然后将内容遍历到/rdf:RDF/*/skos:member/*/@*[local-name()='about']
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2016-03-30
    相关资源
    最近更新 更多