1

我正在使用 RELAX NG Compact,并且遇到过一个子元素被两个独立父元素使用的情况。我该如何解决这个问题?

用例 1

<parent1>
  <field usecase_123="test" />
</parent1>

用例 2

<parent2>
  <field usecase_AAA="test" />
</parent2>

矛盾就在这里:

parent1 = element parent1 { element field { attribute usecase_123 {text} } }

parent2 = element parent2 { element field { attribute usecase_AAA {text} } }
4

1 回答 1

1

RelaxNG 允许元素根据其父元素具有不同的属性。

所以你可以有一个这样的 RelaxNG 语法:

start = root
root = element root { parent1* & parent2* }
parent1 = element parent1 { element field { attribute usecase_123 {text} } }
parent2 = element parent2 { element field { attribute usecase_AAA {text} } }

并且,根据该语法,以下文档实例有效:

<root>
  <parent1>
    <field usecase_123="test" />
  </parent1>
  <parent2>
    <field usecase_AAA="test" />
  </parent2>
</root>

…虽然,对于该语法无效,以下文档实例:

<root>
  <parent1>
    <field usecase_AAA="test" />
  </parent1>
</root>
于 2017-06-30T07:38:28.543 回答