我有一个基于RelaxNG的XML实例,它应该允许(选择)align="right"
,align="left"
和align="{ anything here }"
。右/左很容易:
attribute name="align">
<a:documentation>doc for attrib</a:documentation>
<choice>
<value>left</value>
<a:documentation>doc for left</a:documentation>
<value>right</value>
<a:documentation>doc for right</a:documentation>
</choice>
</attribute>
但是,如何让用户输入{ ... }
作为上述两个值的替代?
答案 0 :(得分:1)
您需要使用XML Schema string
类型并在其上设置pattern
。这是一个例子:
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="top">
<oneOrMore>
<element name="foo">
<attribute name="align">
<choice>
<value>left</value>
<value>right</value>
<data type="string">
<param name="pattern">\{.+\}</param>
</data>
</choice>
</attribute>
</element>
</oneOrMore>
</element>
</start>
</grammar>
测试文件:
<top>
<!-- valid cases -->
<foo align="{fasf}"></foo>
<foo align="left"></foo>
<foo align="right"></foo>
<!-- invalid cases -->
<foo align="fasf"></foo>
<foo align="{}"></foo>
<foo align="a{c}b"></foo>
</top>
请注意分隔有效和无效案例的注释。
我使用的正则表达式允许align="{ab{c}d}"
之类的东西。花括号在花括号内有效,可以开始和结束属性值。我没有任何理由不允许它。