2014-09-25 68 views
2

我有一个属性可以是任何字符串,但是如果它有起始和结束括号"^[.*]$" - 它必须只是以下特定值之一:xsd:SimpleType:如何将属性限制为特定值和正则表达式值

"[EVENT]" 

"[PROTOCOL]" 

所以,"[EVENT]""[PROTOCOL]""SomeString" - 是正确的,但"[SomeString]" - 不是。

我该如何做到这一点?

+0

应该'无右括号[SomeString'有效? – kjhughes 2014-09-25 22:14:05

+0

其实没有。它不应该是有效的。 – lyres 2014-09-25 22:35:30

+0

而且,我猜没有左括号的'SomeString]'也应该是无效的,对吧? [我的答案在下面](http://stackoverflow.com/a/26049756/290085)接受和拒绝在你的问题中列出的情况,加上拒绝''[SomeString''和''SomeString]“''。 – kjhughes 2014-09-26 00:28:11

回答

2

我喜欢@ Burkart使用单独的xs:pattern元素更好(+1),但是我在等待评论中澄清时有此挂起("[SomeString"没有右括号应该是无效的),所以我会发布它,以防万一可能会发现它很有用。在括号内读取正则表达式为EVENT或PROTOCOL或不以括号开始或结束的任何字符串。

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:attribute name="attr"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
      <xs:pattern value="\[(EVENT|PROTOCOL)\]|[^\[].*[^\]]"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

好主意! 更复杂的情况如何:实际上我没有2,但是10个“括号内”变量([EVENT],[PROTOCOL],[SESSION]等) 有效的情况是: 1.任何字符串括号 2.提及了10个“括号内”变量 3.与常规字符串连接的任何括号内的变量,例如:我的[EVENT] _for_ [PROTOCOL] @ google.com 无效情况: 1.任何括号内的字符串,除了10个预定义的 2.与连接相同 3。只有开放或闭合支架的字符串 要短 - 内部括号只能是预定义变量 – lyres 2014-09-26 11:06:00

+0

@lyes,我建议你发布一个新问题。谢谢。 – kjhughes 2014-09-26 11:47:31

+0

谢谢,我在这里发布了新问题: http://stackoverflow.com/questions/26059526/xsdsimpletype-how-to-restrict-attribute-to-list-of-specific-values-with-concat – lyres 2014-09-26 12:25:36

3

使用xs:simpleType和正则表达式来限制基类xs:string类型。您可以有多个xs:pattern以保持替代模式的简单。元素必须匹配其中一种模式,否则验证将失败。由于模式是正则表达式,因此在用作文字时,必须转义“[”和“]”等特殊字符。

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="elem" type="myElemType" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="myElemType"> 
    <xs:attribute name="attrib" type="myAttribType"/> 
    </xs:complexType> 

    <xs:simpleType name="myAttribType"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="\[EVENT\]"/><!-- "[EVENT]": okay --> 
     <xs:pattern value="\[PROTOCOL\]"/><!-- "[PROTOCOL]": okay --> 
     <xs:pattern value="[^\[].*"/><!-- Starts with anything but "[": okay --> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

XML:

<root> 
    <elem attrib="[EVENT]"/> 
    <elem attrib="[PROTOCOL]"/> 
    <elem attrib="SomeString"/> 
    <elem attrib="SomeString]"/> 
    <elem attrib=" [SomeString] "/> 
    <!-- All the above are okay; the ones below fail validation --> 
    <elem attrib="[SomeString]"/> 
    <elem attrib="[SomeString"/> 
</root> 

修改正则表达式你的心脏的内容,例如,失败与领先的和/或尾随空格的例子。

编辑反映OP的评论“SomeString”也应该是无效的。

+0

谢谢!正是我在寻找的东西。 – lyres 2014-09-25 22:37:18

+0

@lyres:很高兴帮助,欢迎来到Stack Overflow。如果此答案或任何其他人解决了您的问题,请点击绿色复选标记将其标记为已接受。 – Burkart 2014-09-25 22:49:43