我需要构建一个 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>
,用于指定元素内容类型,但我无法为其类型找到合适的值属性,解决我的问题。
答案 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
中放置任何你想要的东西。这将接受任何名称空间中的任何元素,包含任何具有任何值的属性,以及元素之间的任何文本。