RelaxNG选择和正则表达

时间:2016-02-02 10:18:31

标签: relaxng

我有一个基于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>

但是,如何让用户输入{ ... }作为上述两个值的替代?

1 个答案:

答案 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}"之类的东西。花括号在花括号内有效,可以开始和结束属性值。我没有任何理由不允许它。