XSD模式匹配逗号分隔单词的优先顺序

时间:2009-11-30 18:07:17

标签: xsd design-patterns

我有这样的标签

<order>foo,bar,goo,doo,woo</order>

我需要使用xsd进行验证。

如何编写与包含以下内容的字符串匹配的正则表达式模式:

  1. {foo,bar,goo,doo,woo} 最多列出一项
  2. 或者是空的。
  3. 有效示例:

    <order>foo,bar,goo,doo,woo</order>
    <order>foo,bar,goo</order>
    <order>foo,doo,goo,woo</order>
    <order>woo,foo,goo,doo,bar</order>
    <order></order>
    

    无效:

    <order>foo,foo</order>
    <order>,</order>
    <order>fo</order>
    <order>foobar</order>
    

    这必须在不同的XML / XSD 解析器中工作。

2 个答案:

答案 0 :(得分:3)

我认为你不能在正则表达式中表达所有规则。特别是,执行“最大一次”将很难。这是我最接近的,

<xs:simpleType name="order">
    <xs:annotation>
      <xs:documentation>
      Comma-separated list of anything
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:pattern value="[^,]+(,\s*[^,]+)*"/>
    </xs:restriction>
</xs:simpleType>

您可能希望尝试将空格用作分隔符。这在XML文件中更常见。 XML Schema具有为空格分隔列表定义的内置类型"list"

答案 1 :(得分:0)

我可以编写一个模式文件,如果它们遵循一些顺序..像{foo,bar,goo,doo,woo}
但是在你的情况下,你说,它们可以出现在任何序列中。
所以(5P5 + 5P4 + 5P3 + 5P2 + 5P1 + 1)= 326模式.. !!!

如果我提到的那样有一些序列..那么模式的数量就是.. 32 ..可忍受..