我想验证XML当且仅当来自id=*
method/key
和{*}
中的method/call
子字符串中的{*}
的双头投放。
有效,因为每个id=*
完全对应于<format>
<call>
/tags/{1}/top-askers/{2}
</call>
<key id="1">
<name>tag</name>
<discussion>a tag for the site</discussion>
</key>
<key id="2">
<name>period</name>
</key>
</format>
反之亦然。
id=*
无效,因为{*}
没有对应的<format>
<call>
/tags/{1}
</call>
<key id="1">
<name>tag</name>
<discussion>a tag for the site</discussion>
</key>
<key id="2">
<name>period</name>
</key>
</format>
。
{*}
无效,因为id=*
没有对应的<format>
<call>
/tags/{1}/top-askers/{2}
</call>
<key id="1">
<name>tag</name>
<discussion>a tag for the site</discussion>
</key>
</format>
。
{*}
理想情况下,我也希望这也是可能的,这意味着[^}{]
的内容可以是<format>
<call>
/tags/{tag}/top-askers/{2}
</call>
<key id="tag">
<name>tag</name>
<discussion>a tag for the site</discussion>
</key>
<key id="2">
<name>period</name>
</key>
</format>
中的任何一个。
for $key in /format/key
return matches($key/../call,
concat("\{", $key/@id, "\}"))
我查看了针对XML架构的w3schools参考,但它似乎没有列出任何此类功能。但是,它肯定不是规范的完整参考。这在XML模式中是否可行?
@JirkaŠ提供了以下表达式,它解决了(2)(和(4))而不是(3):
{{1}}
答案 0 :(得分:1)
IMO,在XSD 1.0中这是不可能的。当然有一些基本约束(xs:unique,xs:key)。这些是使用XPath表达式定义的,但此表达式只是整个XPath语言的子集(请参阅http://docstore.mik.ua/orelly/xml/schema/ch09_02.htm中的第9.2.5章)。 在这种情况下最受限制的事实是不允许函数调用,并且您可能需要一些字符串操作函数,因为“call”元素内容是一个字符串。
如果你可以使用XSD 1.1,还有一些其他功能如何表达更复杂的限制,特别是我脑子里有“xs:assert”。我认为可以在XSD 1.1中调用xpath函数。