RelaxNG 选择与正则表达式
RelaxNG choice and regular expression
我有一个基于 RelaxNG 的 XML 实例,它应该允许(选择)align="right"
、align="left"
和 align="{ anything here }"
。 right/left 很简单:
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>
但是我怎样才能让用户输入 { ... }
作为上面两个值的替代?
您需要使用 XML 架构 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}"
之类的东西。花括号在开始和结束属性值的花括号内有效。我看不出有任何理由禁止它。
我有一个基于 RelaxNG 的 XML 实例,它应该允许(选择)align="right"
、align="left"
和 align="{ anything here }"
。 right/left 很简单:
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>
但是我怎样才能让用户输入 { ... }
作为上面两个值的替代?
您需要使用 XML 架构 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}"
之类的东西。花括号在开始和结束属性值的花括号内有效。我看不出有任何理由禁止它。