如何在XSD中定义支持多枚举值组合的属性?
解决XSD中zone属性支持多地区组合的问题
看起来你想要让zone属性既支持单个地区代码(JP/NA/EU),也支持用|分隔的多个合法地区组合,比如NA|EU这种形式对吧?你的初始枚举只能匹配单个值,而之前尝试的正则模式写法不对,所以才会失效。
正确的XSD属性限制写法
你需要用正则表达式来定义这个属性的合法值,确保它可以是单个地区代码,或者多个用|分隔的合法地区组合。这里是调整后的XSD代码:
<xsd:attribute name="zone"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <!-- 匹配单个地区,或多个用|分隔的地区组合(允许重复,比如JP|JP) --> <xsd:pattern value="(JP|NA|EU)(\|(JP|NA|EU)){0,2}"/> <!-- 如果要严格禁止重复地区(比如JP|JP),可以用更严谨的正则: --> <!-- <xsd:pattern value="JP(?:\|(?!JP)(NA|EU))?|NA(?:\|(?!NA)(JP|EU))?|EU(?:\|(?!EU)(JP|NA))?"/> --> </xsd:restriction> </xsd:simpleType> </xsd:attribute>
正则表达式解释
第一个版本的正则
(JP|NA|EU)(\|(JP|NA|EU)){0,2}:(JP|NA|EU):匹配第一个合法地区代码(\|(JP|NA|EU)){0,2}:允许后面跟0到2个|+合法地区的组合,这样最多支持3个地区的组合(比如JP|NA|EU)- 小缺点:允许重复的地区代码(比如
JP|JP),如果不需要这种情况,用注释里的第二个正则。
第二个严谨版本的正则:
- 它逐个枚举了所有无重复的合法组合,确保每个地区在属性值里只出现一次,比如
JP|NA合法,但JP|JP会被判定为无效。
- 它逐个枚举了所有无重复的合法组合,确保每个地区在属性值里只出现一次,比如
验证你的示例XML
你提供的示例XML:
<releasedate> <zone zone="JP">30/08/1987</zone> <zone zone="NA|EU">22/11/1987</zone> </releasedate>
用上面的任意一种XSD正则规则验证,都是完全合法的。
为什么你之前的模式失效?
- 你用的
JP|NA|EU:这个正则只会匹配单个地区代码,|在这里是“或”的逻辑,它只会识别JP、NA、EU其中之一,不会匹配NA|EU这种组合。 - 你用的
(JP|NA|EU){1,3}:这个会匹配1到3个连续的地区代码(比如JPJP、NAEU),但完全不识别|分隔符,所以自然无法满足你的需求。
内容的提问来源于stack exchange,提问作者PixelFox
相关产品推荐
相关产品推荐

