0

我有以下 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 给出错误。请帮忙。谢谢。

4

2 回答 2

0

最后,我最终像这样检查了 song1 的子字符串。

test="(count(a:thing[substring(@tag,19,8) = 'song1']) > 0)">

它不是完美的方式,因为 /a/thing 和 /./a/thing 同样正确,但据我所知,用户坚持相同的模式。同样在理想情况下,必须在运行时检查这种情况。

希望能帮助到你。

于 2013-04-21T22:32:07.510 回答
0

您需要一个将 XPath 表达式作为字符串并返回计算结果的函数。这在撒克逊语中作为 saxon:evaluate() 可用。

其次,简单类型的断言只能访问被验证的字符串;复杂类型的断言可以访问以元素节点为根的树。您的路径表达式以“/”开头,因此仅适用于以文档节点为根的树。如果您将路径更改为../a/thing[@tag='song1']then 您可以使用表单的 a 元素上的断言来验证它

assert test="every $o in owner satisfies exists(saxon:evaluate($o/@thing))"
于 2013-04-22T07:50:19.017 回答