带有无序必需,可选和任意标签的RNG模式

时间:2015-07-29 17:14:17

标签: xml schema relaxng

这是XSD schema with unordered required, optional and arbitrary tags

的后续问题

我正在尝试使用以下约束制作RNG模式:

  1. 没有订购
  2. 某些元素必须恰好出现一次
  3. 某些元素可能显示为零或无限时间
  4. 允许无法识别的元素(不验证它们)
  5. 使用previous question中的示例,我提出了以下RNG架构:

    <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
    
      <start>
        <element name="person">
          <interleave>                         <!-- no ordering -->
            <element name="name">              <!-- appears exactly once -->
              <data type="string"/>
            </element>
            <optional>                         <!-- appears 0 or 1 times -->
              <element name="age">
                <data type="integer"/>
              </element>
            </optional>
            <zeroOrMore>                       <!-- appears 0 or more times -->
              <element name="phone">
                <data type="integer"/>
              </element>
            </zeroOrMore>
            <ref name="anything"/>             <!-- allow any element -->
          </interleave>
        </element>
      </start>
    
      <define name="anything">
        <zeroOrMore>
          <choice>
            <element>
              <anyName>
                <except>
                  <name>name</name>
                  <name>age</name>
                  <name>phone</name>
                </except>
              </anyName>
              <ref name="anything"/>
            </element>
            <attribute>
              <anyName/>
            </attribute>
            <text/>
          </choice>
        </zeroOrMore>
      </define>
    
    </grammar>
    

    很容易满足前三个约束,但对于第四个(允许无法识别的元素),我无法找到一个很好的解决方案。我所做的是将"anything"定义为一个或多个无法识别的元素,然后在<person>元素中引用它。问题是我必须在<anyName>中明确指定例外:它应匹配任何非"name""age""phone"的元素。如果我遗漏<except>,我会收到以下错误:

    people.rng:5: element interleave: Relax-NG parser error : Element or text conflicts in interleave
    

    具有明确异常的解决方案看起来笨拙和hackish。是否有更好的方法允许任何不被识别的元素?是否有类似于XSD&#39; <any>的内容?

1 个答案:

答案 0 :(得分:0)

我认为这是Relax NG的唯一解决方案。 IMO并不是那么笨拙,但我不知道XSD的any是什么样的。