2013-04-21 71 views
0

我有以下xml。XSD - 验证属性值是否为

<a> 
    <thing tag="song1"> 
    <name>john doe</name> 
    <email>[email protected]</email> 
    </thing> 
    <owner thing="https://stackoverflow.com/a/thing[@tag='song1']"> 
    ... 
    </owner> 
</a> 

我想在XSD断言,当“东西”与标签“松1”存在,“所有者”必须事=“/ A /事情[@标记=”松1' ]。

我的逻辑尝试在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

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

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

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

希望它有帮助。

0

您需要一个将XPath表达式作为字符串并返回评估结果的函数。 Saxon将它作为saxon提供:evaluate()。其次,简单类型的断言只能访问正在验证的字符串;复杂类型的断言可以访问以元素节点为根的树。您的路径表达式以“/”开头,因此仅适用于以文档节点为根的树。如果您将路径更改为../a/thing[@tag='song1'],那么您可以通过以下形式的断言来验证它:

assert test="every $o in owner satisfies exists(saxon:evaluate($o/@thing))"