在正则表达式中使用枚举限制类型

时间:2012-06-07 09:48:47

标签: xsd

我有一个XSD文件,我已经定义了一个像这样的枚举限制的简单类型。

<xs:simpleType name="myEnumStrings">
    <xs:restriction base="xs:string">
        <xs:enumeration value="first"/>
        <xs:enumeration value="second"/>
        ...
        <xs:enumeration value="last"/>
    </xs:restriction>
</xs:simpleType>

我有第二个简单类型,其值以复杂的方式取决于myEnumStrings的可能值,我只能用模式描述。

<xs:simpleType name="patternRestrictedType">
    <xs:restriction base="xs:string">
        <xs:pattern value="..."/>
    </xs:restriction>
</xs:simpleType>

目前我正在使用字符串

复制正则表达式中的信息
(first|second|...|last)

每当我想引用myEnumStrings时。这虽然是一个麻烦制造者和bug的来源,因为我需要在修改myEnumStrings类型时保持所有正则表达式为最新。

有没有办法在正则表达式中引用myEnumStrings的可能值来避免这种重复?如果这是不可能的,有没有办法定义globaly在正则表达式中重用的字符串(first | second | ... | last),以限制仅在两个位置的重复并使正则表达式更具可读性?

1 个答案:

答案 0 :(得分:2)

XSD并不擅长,就像“优雅”一样。唯一可能有用的是使用工会;它可以根据你的特定模式工作,但它可能无法根据你没有描述的其他东西起作用。

这个想法是重用枚举。为此,您可以创建封装要重用的枚举的简单类型。只是一个观察,具有多个枚举值在技术上等同于其值的分离(就模式而言)。

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:simpleType name="myEnumStrings-1">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="first"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="myEnumStrings-2">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="second"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="myEnumStrings-n">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="last"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="myEnumStrings">
        <xsd:union memberTypes="myEnumStrings-1 myEnumStrings-2 myEnumStrings-n"/>
    </xsd:simpleType>

    <xsd:simpleType name="patternRestrictedType">
        <xsd:union memberTypes="myEnumStrings-1 myEnumStrings-2"/>
    </xsd:simpleType>

    <xsd:element name="root-a" type="myEnumStrings"/>
    <xsd:element name="root-b" type="patternRestrictedType"/>
</xsd:schema>

以上实现了枚举的重用,或者您定义为工会成员约束的任何其他内容。

root-a的有效XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root-a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">last</root-a>

root-b的有效XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root-b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">second</root-b>

虽然root-b的内容适用于root-a,但反之则不然。

正如我所说,当你想到大集时,也许不那么优雅;但是,应该严格回答我的想法,并指出其他方法。