对结构未知的节点进行RelaxNG验证

时间:2014-04-02 17:55:24

标签: xml xml-validation relaxng

我需要构建一个 RelaxNG 验证架构,我遇到了这样的问题:

我需要验证内部带有<optional>标记的文档,此<optional>标记可能会包含其他一些标记,而我不知道他们的模式,或者他们不知道没有统一的。

简化样本:

<?xml version="1.0" encoding="UTF-8"?>
<elements>
  <first>
    <name>John</name>
    <sname>Silver</sname>
  </first>
  <second>
    <phone>+123456789</phone>
    <mail>js@p.com</mail>
  </second>
  <optional>
     ...
  <optional>
</elements>

我清楚地知道<first><second>标记内应包含哪些内容,但<optional>可能包含文字或复杂节点结构。

RelaxNG中有什么东西可以标记一个元素,它的内部结构会被忽略吗?

我在这里寻找像<anyType />这样的东西,但实际上没有任何类型的东西。

<element name="optional">
  <anyType />
  <zeroOrMore>
    <attribute>
      <anyName/>
    </attribute>
  </zeroOrMore>
</element>

RelaxNG中还有一个标记 <data> ,用于指定元素内容类型,但我无法为其类型找到合适的值属性,解决我的问题。

1 个答案:

答案 0 :(得分:1)

如果您定义optional这样的元素:

<element name="optional">
  <ref name="any"/>
</element>

并像这样定义any

  <define name="any">
    <zeroOrMore>
      <choice>
        <attribute>
          <anyName/>
        </attribute>
        <text/>
        <element>
            <anyName/>
            <ref name="any"/>
        </element>
      </choice>
    </zeroOrMore>
  </define>

你应该能够在optional中放置任何你想要的东西。这将接受任何名称空间中的任何元素,包含任何具有任何值的属性,以及元素之间的任何文本。