【问题标题】:XSD 1.1 assert attribute must be present in documentXSD 1.1 assert 属性必须存在于文档中
【发布时间】:2015-06-03 19:23:32
【问题描述】:

使用 XSD 1.1 是否可以断言某个属性存在于其他地方。

示例:

<root>
  <someelement>
    <lookup name="test"/>
    <bla>
      <lookup name="tbl2"/>
      <morebla>
        <evenmore>
          <lookup name="tbl2"/>
        </evenmore>
      </morebla>
    </bla>
  </someelement>
  <table name="test">
    ...
  </table>
  <table name="tbl2">
    ...
  </table>
</root>

我如何断言元素查找具有在表格元素中使用的名称?

断言需要在根元素上,因为不可能断言元素树,但是我如何断言每个查找元素,无论它在文档结构中的什么位置?

【问题讨论】:

  • //x 选择所有名为 x 的节点,如您在简单教程的this page 中所见。
  • 是的 //operator 是我自己尝试的。我的想法是每一个 $i 在 1 中计数(//lookup) 满足存在(//table/@name = lookup[$i]/@name) 但是这不起作用,所以我不确定 / /lookup 部分错误或我满意的部分。
  • 对不起。我已经阅读了您的问题,并且我以为您不知道该基本运算符。你的方法没问题,看看我的答案,它也使用every $v1 in $v2 satisfies 语法。

标签: xml xsd xsd-1.1


【解决方案1】:

请记住,在 XPath 2.0 中比较 $s1 = $sequence2 当且仅当 $s1(或其任何元素,如果它是一个序列)存在于 $sequence2 中时才返回 true。所以你可以为你的断言使用这个简单的 XPath 测试:

every $lookupName in descendant-or-self::lookup/@name satisfies $lookupName = descendant-or-self::table/@name

【讨论】:

  • 嗯,我试过了,将它作为 XPath 2.0 查询执行它可以工作,但作为 xsd 文件中的断言却不行。我正在使用 Oxygen XML Editor 17.0 进行尝试,它给了我以下错误“系统 ID:/home/christian/BF-XML/test.xml 主验证文件:/home/christian/BF-XML/test.xml架构:/home/christian/BF-XML/test.xsd 引擎名称:Saxon-EE 9.6.0.5 严重性:错误描述:元素根不满足断言每个 !$lookupName in //Lookup/@table 满足 $lookupName = / /Table/@name 开始位置:21:0"
  • 我尝试了一个不同的验证器并得到了更好的错误描述:引擎名称:Xerces 严重性:警告描述:cvc-xpath.3.13.4.2b:一个断言 XPath 表达式,例如 ('every $lookupName in //Lookup/@table 满足 $lookupName = //Table/@name') 包含 / 或 //,在模式类型 '#AnonType_root' 上,不能产生有效结果(因为断言树植根于无父元素) .开始地点:9:23 结束地点:9:99 URL:w3.org/TR/xmlschema11-1/#cvc-xpath
  • @ChristianKruetzfeldt 你是对的(我也在 Oxygen 中使用查询)。为了使它在 XSD 1.1 断言中工作,您可以使用 ax descendant-or-self。我已经更新了答案。
  • 您可能想知道,Saxon 对“ABC 中的每个 $x 都满足 DEF”形式的断言进行了优化——如果有一个元素 $x 不满足条件 DEF,它将告诉你那个特定元素的位置。
  • @sergioFC 谢谢,你更新的答案完美无缺,更重要的是我也明白为什么 - 学到了一些关于 XSD 的新东西。
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2016-10-19
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多