我有以下xml。
<a>
<thing tag="song1">
<name>john doe</name>
<email>john@example.com</email>
</thing>
<owner thing="/a/thing[@tag='song1']">
...
</owner>
</a>
我想在XSD中声明,当标签'song1'的'thing'出现时,'owner'必须有thing ='/ a / thing [@ tag ='song1']。
我在XSD中的逻辑尝试是
<sch:assert
test="(count(a:owner[@thing=a:thing[@tag='song1']]) > 0) = count(a:thing[@tag='song1']) > 0))">Error</sch:assert>
</sch:rule>
氧气验证器为此xsd提供错误。请帮忙。感谢。
答案 0 :(得分:0)
最后我最终检查了song1的子串,就像这样。
test="(count(a:thing[substring(@tag,19,8) = 'song1']) > 0)">
它不是完美的方式/ / / /和/./a/thing同样正确,但据我所知,用户坚持使用相同的模式。同样在理想的世界中,必须在运行期间检查此情况。
希望它有所帮助。
答案 1 :(得分:0)
您需要一个将XPath表达式作为字符串并返回计算结果的函数。撒克逊人可以将其作为撒克逊人使用:evaluate()。
其次,对简单类型的断言只能访问被验证的字符串;复杂类型的断言可以访问以元素节点为根的树。您的路径表达式以&#34; /&#34;开头。因此只适用于以文档节点为根的树。如果您将路径更改为../a/thing[@tag='song1']
,那么您可以使用表单元素上的断言来验证它
assert test="every $o in owner satisfies exists(saxon:evaluate($o/@thing))"