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}" 之类的东西。花括号在开始和结束属性值的花括号内有效。我看不出有任何理由禁止它。