如何将XML内容限制为XML中的其他内容(作为参考)?

时间:2014-07-25 04:46:57

标签: xml validation xpath xsd

我想验证XML当且仅当来自id=* method/key{*}中的method/call子字符串中的{*}的双头投放。

  1. 有效,因为每个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=*
  2. 无效,因为{*}没有对应的<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>

    {*}
  3. 无效,因为id=*没有对应的<format> <call> /tags/{1}/top-askers/{2} </call> <key id="1"> <name>tag</name> <discussion>a tag for the site</discussion> </key> </format>

    {*}
  4. 理想情况下,我也希望这也是可能的,这意味着[^}{]的内容可以是<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, "\}"))
    
  5. 我查看了针对XML架构的w3schools参考,但它似乎没有列出任何此类功能。但是,它肯定不是规范的完整参考。这在XML模式中是否可行?

    更新

    @JirkaŠ提供了以下表达式,它解决了(2)(和(4))而不是(3):

    {{1}}

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函数。