注意:我是这些技术的初学者。
我制作了一个a.sch(schematron文件)和b.xml,我正在使用libxml2 C API进行验证。除了我在断言消息中没有看到<value-of select=''xpath here''>
的值之外,一切都运行良好。我正在使用xmllint应用程序,该应用程序可以在libxml2 git存储库(https://git.gnome.org/browse/libxml2)中找到。命令行和结果显示在本文末尾。
如果我使用相同的文件并使用以下python代码,我可以在断言消息中看到值。
#!/usr/bin/env python
from lxml import isoschematron
from lxml import etree
def runsch(rulesFile, xmlFile):
# open files
rules = open(rulesFile, 'r') # Schematron schema
XMLhere = open (xmlFile, 'r') # XML to be checked
# Parse schema
sct_doc = etree.parse(rules)
schematron = isoschematron.Schematron(sct_doc, store_report = True)
# Parse xml
doc = etree.parse(XMLhere)
# Validate against schema
validationResult = schematron.validate(doc)
report = schematron.validation_report
# Check result
if validationResult:
print("passed")
else:
print("failed")
print(report)
reportFile = open('report.html', 'wb')
report.write(reportFile)
def main():
runsch('a.sch', 'b.xml')
if __name__ == '__main__':
main()
这是a.sch:
<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron" schemaVersion="1.0" xml:lang="en" >
<title>Different behavior of libxml2 C API vs lxml Python regarding value-of select in assert message</title>
<ns prefix="test" uri="test"/>
<pattern id="a">
<rule context="test:b">
<assert test="count(test:c) = 3">There's only <value-of select="count(test:c)"/> c element(s), it is mandatory to have 3.</assert>
</rule>
</pattern>
</schema>
这是b.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<?valbuddy_schematron a.sch?>
<a xmlns="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<b>
<c>word 1</c>
<c>word 2</c>
</b>
</a>
这是使用libxml2 C API的命令行(用您的路径替换文件路径):
xmllint --schematron~ / svn / r-oltcms / Config / a.sch 〜/ SVN / R-oltcms /配置/ B.XML
以下是结果的一部分,我们可以看到在断言消息中我们没有得到select的值。
> /*/* line 4: There's only c element(s), it is mandatory to have 3.
> /home/oltcms/svn/r-oltcms/Config/b.xml fails to validate
这是python脚本结果的一部分,我们可以看到我们在断言消息中得到select-value。
> <svrl:failed-assert test="count(test:c) = 3"
> location="/*[local-name()='a' and
> namespace-uri()='test']/*[local-name()='b' and
> namespace-uri()='test']">
> <svrl:text>There's only 2 c element(s), it is mandatory to have 3.</svrl:text> </svrl:failed-assert>
那么,有没有办法在使用libxml2 C API的断言消息中获取这些内容?欢迎任何解释。
谢谢,
米歇尔
答案 0 :(得分:0)
我认为 libxml2 只实现了an early Schematron version,可能是1.5或1.6,它不支持value-of
中的assert
。与 libxml2 的Schematron验证器的Python绑定位于lxml.etree.Schematron
。但lxml
还提供了lxml.isoschematron.Schematron
,它似乎支持较新的Schematron版本。此验证器不是直接基于 libxml2 ,而是基于XSLT转换。因此,可能无法使用 libxml2 的C API或value-of
从assert
中获取xmllint
的值,但您可以尝试将value-of
放入diagnostic
。