有没有办法写出对 Relax NG 中元素的内容完全没有限制?
在 XML Schema 中,这样的事情显然是可能的
<xs:sequence>
<xs:any namespace="##targetNamespace" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
我可以在 Relax NG 中做同样的事情吗?
有没有办法写出对 Relax NG 中元素的内容完全没有限制?
在 XML Schema 中,这样的事情显然是可能的
<xs:sequence>
<xs:any namespace="##targetNamespace" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
我可以在 Relax NG 中做同样的事情吗?
我提出这个解决方案,划分属性和元素声明,并使用mixed
元素来允许混合内容。
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<ref name="anyElement"/>
</start>
<define name="anyElement">
<element>
<anyName/>
<ref name="anyAttributes"/>
<mixed>
<zeroOrMore>
<ref name="anyElement"/>
</zeroOrMore>
</mixed>
</element>
</define>
<define name="anyAttributes">
<zeroOrMore>
<attribute>
<anyName/>
</attribute>
</zeroOrMore>
</define>
</grammar>
好的,我不知道这是否是最好的方法,但我已经从 Relax NG 规范中的“任何”定义中改编了这个。
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<ref name="Anything"/>
</start>
<define name="Anything">
<zeroOrMore>
<choice>
<element>
<anyName/>
<ref name="Anything"/>
</element>
<attribute>
<anyName/>
</attribute>
<text/>
</choice>
</zeroOrMore>
</define>
</grammar>