Schematron 规则失败 Pattern '' Failed : [123] Picture obligatory

Schematron rule fails Pattern '' Failed : [123] Picture obligatory

我正在对 XML 文件使用 schematron 验证。我尝试编写我的第一条规则并使用在线工具 https://www.liquid-technologies.com/online-schematron-validator 检查它。这个规则有什么问题?我想要做的是验证 Picture 节点是否存在,如果它存在,里面是否有一些文本,所以它不能是这样的:<Picture/> 而是 <Picture>aasd</Picture>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message>
  <book>
    <chapterA>
      <SectionA>
        <Picture>picture</Picture>
      </SectionA>
    </chapterA>
  </book>
</Message>

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2">
  <title>Myrule</title>
  <pattern>
    <rule context="Message">
      <assert test="boolean(/*[local-name() = 'book']/*[local-name() = 'chapterA']/*[local-name() = 'SectionA']/*[local-name() = 'Picture'])" flag="fatal" id="id123">[123] Picture obligatory</assert>
    </rule>
  </pattern>
</schema>

我不知道 schematron 是什么,但查看规则我认为 xpath 不正确。如果你改变

<assert test="boolean(/*[local-name() = 'book']/*[local-name() = 'chapterA']/*[local-name() = 'SectionA']/*[local-name() = 'Picture'])" flag="fatal" id="id123">[123] Picture obligatory</assert>

<assert test="boolean(/Message/*[local-name() = 'book']/*[local-name() = 'chapterA']/*[local-name() = 'SectionA']/*[local-name() = 'Picture'])" flag="fatal" id="id123">[123] Picture obligatory</assert>

有效。

但是你的xpath不检查图片元素是否为空。我也觉得可以简化成这样

<assert test="boolean(/Message/book/chapterA/SectionA/Picture/text())" flag="fatal" id="id123">[123] Picture obligatory</assert>

当图片元素为空时,这将抛出您定义的致命错误。