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>
当图片元素为空时,这将抛出您定义的致命错误。
我正在对 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>
当图片元素为空时,这将抛出您定义的致命错误。