XSD - 验证元素,它是属性的值

时间:2013-04-21 20:01:26

标签: xml xsd xml-validation

我有以下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提供错误。请帮忙。感谢。

2 个答案:

答案 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))"